我有類似下面的類:C#泛型類「專業」構造
public class DropDownControl<T, Key, Value> : BaseControl
where Key: IComparable
{
private IEnumerable<T> mEnumerator;
private Func<T, Key> mGetKey;
private Func<T, Value> mGetValue;
private Func<Key, bool> mIsKeyInCollection;
public DropDownControl(string name, IEnumerable<T> enumerator, Func<T, Key> getKey, Func<T, Value> getValue, Func<Key, bool> isKeyInCollection)
: base(name)
{
mEnumerator = enumerator;
mGetKey = getKey;
mGetValue = getValue;
mIsKeyInCollection = isKeyInCollection;
}
而且我想添加一個方便的功能字典(因爲它們有效地支持自己的所有操作)。
但問題是,這樣的構造函數只會指定鍵和值但不直接T,而T是剛剛KeyValuePair。有沒有辦法告訴了此構造T中的編譯器是KeyValuePair,如:
public DropDownControl<KeyValuePair<Key, Value>>(string name, IDictionary<Key, Value> dict) { ... }
目前我使用靜態的創建功能的解決方法,但我想直接的構造更好。
public static DropDownControl<KeyValuePair<DKey, DValue>, DKey, DValue> Create<DKey, DValue>(string name, IDictionary<DKey, DValue> dictionary)
where DKey: IComparable
{
return new DropDownControl<KeyValuePair<DKey, DValue>, DKey, DValue>(name, dictionary, kvp => kvp.Key, kvp => kvp.Value, key => dictionary.ContainsKey(key));
}
那麼我正在尋找一種方法來做類似於C++部分模板的特化。但似乎C#目前無法做到這一點(甚至沒有技巧)。 – Fionn 2008-10-06 08:37:19