它的一個有趣的問題,這裏是我想出了一個方法:
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