它的一个有趣的问题,这里是我想出了一个方法:
public class LocalizableSetting<T> : IEnumerable<KeyValuePair<string, T>>
{
private Dictionary<string, T> _values;
public T this[string cultureName]
{
get { return _values[cultureName]; }
set
{
_values[cultureName] = value;
}
}
public IEnumerator<KeyValuePair<string, T>> GetEnumerator()
{
return _values.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return _values.GetEnumerator();
}
public static implicit operator T(LocalizableSetting<T> value)
{
return value[CultureInfo.CurrentCulture.Name];
}
public static implicit operator LocalizableSetting<T>(T value)
{
var setting = new LocalizableSetting<T>();
setting[CultureInfo.CurrentCulture.Name] = value;
return setting;
}
}
这里LocalizableSetting
存储在内部的字典,这实在是没有什么特别的本地化值,但我增加了一个功能,允许它像普通的属性可以作为很好,T他隐式转换运算符。
这确实需要一些技巧,不过使用,为了在一个类中正确地使用它,你不能使用自动性能,因为你必须合并两个一组,而不是覆盖它,所以这里是如何在一类使用它的一个例子:
public class SomeLocalizableClass
{
//Explicitly declare the backing field for the property!
private LocalizableSetting<int> _intSetting = new LocalizableSetting<int>();
public LocalizableSetting<int> IntSetting
{
get { return _intSetting; }
set
{
//Merge, don't overwrite
foreach (var kvp in value)
_intSetting[kvp.Key] = kvp.Value;
}
}
}
注意,在set
方法中,通过值进行迭代,并且任一覆盖当前或增加了一个新的(与分度器的帮助下)。
因此,这可以让你做这样的事情:
public class SomeConsumerClass
{
public void SomeMethod()
{
SomeLocalizableClass c = new SomeLocalizableClass();
c.IntSetting["fr-FR"] = 4; //Sets the french setting
c.IntSetting = 10; //Sets the current culture setting
int multipleSetting = c.IntSetting * c.IntSetting;
}
}
凡multipleSetting
将是该属性的当前区域性值的倍数,由于从LocalizableSetting<int>
到int
隐式转换。 c.IntSetting = 10
会导致从源类型(int
)到LocalizableSetting<int>
的隐式转换,然后将其分配给属性,这就是为什么需要合并而不是覆盖。
我在这里留下了几个(大)的漏洞,即如果没有找到该文化的值(当前它将抛出异常),该属性应该返回一些默认值。但它显示了解决这个问题的一种方法。
只需使用字典。 – SLaks