将实例化的 System.Type 作为通用方法的类型参数传递

Posted

技术标签:

【中文标题】将实例化的 System.Type 作为通用方法的类型参数传递【英文标题】:Passed an instantiated System.Type as a Type Parameter for a Generic method 【发布时间】:2010-10-06 08:28:41 【问题描述】:

我有这个代码 sn-p 我想简化:

        switch (typeString)
        
            case "boolean":
                CreateSimpleRows<bool>(ref group, value);
                break;
            case "datetime":
                CreateSimpleRows<DateTime>(ref group, value);
                break;
            case "double":
                CreateSimpleRows<double>(ref group, value);
                break;
            case "int32":
                CreateSimpleRows<int>(ref group, value);
                break;
            case "int64":
                CreateSimpleRows<long>(ref group, value);
                break;
            case "string":
                CreateSimpleRows<string>(ref group, value);
                break;
        

方法被声明为CreateSimpleRows&lt;T&gt;。我尝试传递一个 System.Type 实例,但没有成功。

我遇到了一个类似问题的答案: Pass An Instantiated System.Type as a Type Parameter for a Generic Class

我检查过,发现 MethodInfo 类中有一个 MakeGenericMethod。 问题是,我不知道如何将“CreateSimpleRows”转换为 MethodInfo 实例。

我想实现的目标有可能吗? 提前感谢您的回复。

【问题讨论】:

当然这很酷,如果你的目标是“简化”我会远离反思。 @jdv 是的,现在使用反射破坏了我简化的意图,这让我很震惊。感谢您指出这一点。 How to use reflection to call generic Method?的可能重复 【参考方案1】:

要获得MethodInfo,请致电Type.GetMethod

MethodInfo method = typeof(TypeContainingMethod).GetMethod("CreateSimpleRows");
MethodInfo generic = method.MakeGenericMethod(typeArgument);

请注意,如果您想获得一个非公共方法,您需要使用 GetMethod 的重载,它也需要一个 BindingFlags

目前还不清楚为什么要通过反射来做到这一点。虽然您当前的 sn-p 是重复的,但至少易于理解。使用反射可能会使事情更容易出错,并且您仍然必须将 typeString 映射到 Type 才能开始。

【讨论】:

我明白了。我猜我最初的意图是删除代码的重复部分。看到您对类似问题的回答让我希望这是可能的。我现在才想到使用反射实际上违背了我的初衷。感谢您的快速回复! :)

以上是关于将实例化的 System.Type 作为通用方法的类型参数传递的主要内容,如果未能解决你的问题,请参考以下文章

C# 使用 System.Type 作为通用参数

反射 - 从 System.Type 实例获取通用参数

在Typescript中,如何在工厂(ish)函数中实例化的类上获取方法的通用返回类型

如何从文字中实例化System.Types列表?

不可实例化的超类

带有 lambda 作为每个实例化的唯一默认参数的模板