传递类型并将其作为类型参数使用

时间:2014-11-03 19:16:34

标签: c#

为什么我不能这样做:

var myDictionary = new Dictionary<string, Type>();

// Add data to dictionary

foreach(var kvPair in myDictionary)
{
    var result = SomeMethod<kvPair.Value>(kvPair.Key); // Error
}

所以我不能在Dictionary元素中使用Type,并在type参数中使用它。是的我可以将字典发送到SomeMethod(KeyValuePair)。但是我无法控制函数的实现方式。

错误:找不到类型或命名空间名称'kvPair'(您是否缺少using指令或程序集引用?

我觉得我错过了一些非常基础的东西,我不确定它是什么。

1 个答案:

答案 0 :(得分:3)

  

我觉得我错过了一些非常基础的东西,我不确定它是什么。

是的,你错过了通用参数是静态的,而不是动态的。它们在运行时无法被发现。在您的情况下,一个选项是使用反射在运行时构建泛型方法调用:

foreach(var kvPair in myDictionary)
{
    // use reflection to create generic MethodInfo object
    MethodInfo mi = typeof(this).GetMethod("SomeMethod");
    MethodInfo mig = mi.MakeGenericMethod(kvPair.Value);

    // call generic method
    Object result = mig.Invoke(this, new object[] {kvPair.Key}); 

    // cast to desired return type.
}

然而,在走这条路之前,我会退后一步,看看仿制药是否是最好的设计,现在你知道它们不是迟到的。