是否有可能绑定某个类的任何动态属性?

时间:2014-04-30 10:26:01

标签: c# dynamic

我想定义一个动态类,如下所示:

dynamic LocalizationHelper;

string s = LocalizationHelper.View1_Question;

它应该完成以下任务:

string s = Resource.ResourceManager.GetString("View1_Question", CultureInfo.GetCultureInfoByIetfLanguageTag(Config.Language)

是否有可能实现类似的目标?

ps:我不能简单地Resource.View1_Question因为我已经设置了资源而不是为了这样做而产生c#代码。而且我对一般解决方案感兴趣。不仅仅是本地化。

3 个答案:

答案 0 :(得分:3)

是的,你可以。从LocalizationHelper继承您的DynamicObject班级并覆盖TryGetMember方法。

TryGetMember方法如下所示:

public virtual bool TryGetMember(GetMemberBinder binder, out Object result)

binder.Name将告诉您调用者要求的名称属性,因此您可以在本地化字典中查找该键并通过设置out Object result返回该值。

答案 1 :(得分:3)

覆盖DynamicObject并实施TryGetMember

用法

var s = LocalizationHelper.Instance.View1_Question; 
Console.WriteLine(s);

DynamicObject

class LocalizationHelper:DynamicObject
{
     static private dynamic inst = null;
     public static dynamic Instance {
        get {
            return inst ?? (inst = new LocalizationHelper());
        }
     }

     public override bool TryGetMember(
        GetMemberBinder binder, out object result)
    {
        string name = binder.Name.ToLower();

        result = Resource.ResourceManager.GetString(name);
        return true;
    }
}

答案 2 :(得分:2)

动态静态字段或属性doesn't seem to be possible

您可以使用静态属性,但您必须写出您想要的所有属性。

public static class LocalizationHelper {
    public static string View1_Question {
        get { return Resource.ResourceManager.GetString("View1_Question", CultureInfo.GetCultureInfoByIetfLanguageTag(Config.Language)); }
    }
}

var q1 = LocalizationHelper.View1_Question;