gpt4 book ai didi

具有 "specialized"构造函数的 C# 泛型类

转载 作者:太空狗 更新时间:2023-10-30 00:09:35 25 4
gpt4 key购买 nike

我有一个类如下:

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;
}

而且我想为字典添加一个方便的功能(因为它们自身有效地支持所有操作)。

但问题是这样的构造函数只会指定Key和Value,不会直接指定T,而T只是KeyValuePair。有没有办法告诉编译器这个构造函数 T 是 KeyValuePair,比如:

public DropDownControl<KeyValuePair<Key, Value>>(string name, IDictionary<Key, Value> dict) { ... }

目前我使用静态 Create 函数作为解决方法,但我更喜欢直接构造函数。

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));
}

最佳答案

不,基本上。非泛型类中的静态方法(例如 DropDownControl [no <>])是最好的方法,因为您应该能够在调用 Create() 时使用类型推断 - 即

var control = DropDownControl.Create(name, dictionary);

C# 3.0 通过“var”(在这里非常受欢迎)和大大改进的泛型类型推断规则来提供帮助。在某些(更一般的)情况下,另一个类似的选项是扩展方法,但是从字典创建非常具体的控件的扩展方法感觉不太自然 - 我会使用非扩展方法。

类似于:

public static class DropDownControl
{
public static DropDownControl<KeyValuePair<TKey,TValue>, TKey, TValue>
Create<TKey,TValue>(IDictionary<TKey, TValue> value, string name)
where TKey : IComparable
{
return new DropDownControl<KeyValuePair<TKey, TValue>, TKey, TValue>
(name, value, pair => pair.Key, pair => pair.Value,
key => value.ContainsKey(key)
);
}
}

另一种选择是继承,但我不太喜欢...

public class DropDownControl<TKey, TValue> :
DropDownControl<KeyValuePair<TKey, TValue>, TKey, TValue>
where TKey : IComparable
{
public DropDownControl(IDictionary<TKey, TValue> lookup, string name)
: base(name, lookup, pair => pair.Key, pair => pair.Value,
key => lookup.ContainsKey(key)) { }
}

这会增加复杂性并降低您的灵 active ...我不会这样做...

总的来说,听起来你想要只使用 IDictionary<,> - 我想知道你是否不能简化你的控件来只使用它,并强制非字典调用者包装自己在 IDictionary<,> 外观中?

关于具有 "specialized"构造函数的 C# 泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/170272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com