是否可以将某个行为绑定到类的任何动态属性
本文关键字:任何 属性 动态 绑定 是否 | 更新日期: 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;