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

本文关键字:类型参数 类型 | 更新日期: 2023-09-27 18:28:53

为什么我不能做这样的事情:

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指令或程序集引用?

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

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

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

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

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

然而,在走上这条路之前,我会退一步,看看泛型是否是最好的设计,现在你知道它们不会过时。