如何使用两个参数创建泛型,其中第二个参数依赖于第一个参数。在这种情况下,我正在创建一个哈希类,我需要对象的类型和标识它的键。
一些简化的解释代码:
class MyCache<T,Key> : where T is CommonImpl {
Dictionary<Key,T> cache;
T Get( Key v ) {
...
var newValue = new T(v);
return newValue;
}
}
class ImplA : CommonImpl {
public ImplA( String key ) { }
}
class ImplB : CommonImpl {
public ImplB( SomeType key ) { }
}
我对此缓存MyCache<ImplA,String>
和MyCache<ImplB,SomeType>
有两种用法。
答案 0 :(得分:2)
我认为你想要达到的目标是这样的:
public abstract class Base<TKey>
{
public Base(TKey key) { }
}
public class ImplA : Base<string>
{
public ImplA(string key) : base(key) {}
}
public class MyCache<TBase, TKey> where TBase : Base<TKey>
{
public TBase Get(TKey key)
{
return (TBase)Activator.CreateInstance(typeof(TBase), key);
}
}
然后你可以打电话
var b = new MyCache<ImplA, string>().Get("hi");
答案 1 :(得分:1)
您不能对通用类/方法说它应该是具体A
或B
。你只能告诉它它有一个共同点:基类或接口。
这就是它应该寻找的例子:
接口:
interface IImpl {
void SomeCommonMethod();
}
泛型类(这里告诉T
必须实现接口,因此它可以是实现接口的任何类)。此外,你必须告诉它有一个使用new
约束的默认构造函数(如注释中所述,不可能告诉它有一个类型为Key
的参数):
class MyCache<T,Key> : where T : IImpl, new() {
关键课程:
class ImplA : IImpl {
public ImplA( String key ) { }
}
class ImplB : IImpl {
public ImplB( SomeType key ) { }
}