我想定义一个动态类,如下所示:
dynamic LocalizationHelper;
string s = LocalizationHelper.View1_Question;
它应该完成以下任务:
string s = Resource.ResourceManager.GetString("View1_Question", CultureInfo.GetCultureInfoByIetfLanguageTag(Config.Language)
是否有可能实现类似的目标?
ps:我不能简单地Resource.View1_Question
因为我已经设置了资源而不是为了这样做而产生c#代码。而且我对一般解决方案感兴趣。不仅仅是本地化。
答案 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);
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;