c# - 如何使用反射调用泛型方法?

标签 c# .net generics reflection

当类型参数在编译时未知,而是在运行时动态获取时,调用泛型方法的最佳方式是什么?

考虑以下示例代码 - 在 Example() 中方法,调用 GenericMethod<T>() 最简洁的方法是什么?使用 Type存储在 myType变量?

public class Sample
{
    public void Example(string typeName)
    {
        Type myType = FindType(typeName);

        // What goes here to call GenericMethod<T>()?
        GenericMethod<myType>(); // This doesn't work

        // What changes to call StaticMethod<T>()?
        Sample.StaticMethod<myType>(); // This also doesn't work
    }

    public void GenericMethod<T>()
    {
        // ...
    }

    public static void StaticMethod<T>()
    {
        //...
    }
}

最佳答案

您需要使用反射来获取开始的方法,然后通过使用 MakeGenericMethod 提供类型参数来“构造”它:

MethodInfo method = typeof(Sample).GetMethod(nameof(Sample.GenericMethod));
MethodInfo generic = method.MakeGenericMethod(myType);
generic.Invoke(this, null);

对于静态方法,将null 作为第一个参数传递给Invoke。这与泛型方法无关 - 这只是正常的反射。

如前所述,从 C# 4 开始,使用 dynamic 很多事情都变得更简单了——当然,如果您可以使用类型推断。它在类型推断不可用的情况下没有帮助,例如问题中的确切示例。

关于c# - 如何使用反射调用泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48150205/

相关文章:

c# - 从文件夹中的图像列表显示图像 C# UWP

c# - 在单元测试中使用 RowTest 是一个好习惯吗

Java 未经检查的转换

c# - 如何在 C# 的 SqlDataAdapter 中使用 WHERE

list - 在 Dart 中,List.from 和 .of、Map.from 和 .of 之间有什么区别?

java - 类关系强类型化的最佳模式

c# - 为什么使用标志+位掩码而不是一系列 bool 值?

c# - 自增非键值 Entity Framework 核心2.0

c# - 自托管 Web API 的正确方法是什么?

c# - Elmah 将消息添加到通过调用 Raise(e) 记录的错误中