是否可以将某个行为绑定到类的任何动态属性

本文关键字:任何 属性 动态 绑定 是否 | 更新日期: 2023-09-27 18:00:59

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

dynamic LocalizationHelper;
string s = LocalizationHelper.View1_Question;

它应该完成以下任务:

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

有可能实现类似的目标吗?

ps:我不能简单地执行Resource.View1_Question,因为我已经设置了资源以不生成用于执行该操作的c#代码。而且我对一般的解决方案很感兴趣。不仅仅是为了本地化。

是否可以将某个行为绑定到类的任何动态属性

覆盖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;
    }
}

可以。从DynamicObject继承LocalizationHelper类并重写TryGetMember方法。

TryGetMember方法如下:

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

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

动态静态字段或属性似乎是不可能的。

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

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;