具有多个参数的泛型类中的依赖类型约束

时间:2014-12-01 09:47:02

标签: c# generics

如何使用两个参数创建泛型,其中第二个参数依赖于第一个参数。在这种情况下,我正在创建一个哈希类,我需要对象的类型和标识它的键。

一些简化的解释代码:

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>有两种用法。

2 个答案:

答案 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)

您不能对通用类/方法说它应该是具体AB。你只能告诉它它有一个共同点:基类或接口。

这就是它应该寻找的例子:

接口:

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