如何使用反射来调用泛型方法?

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


考虑以下示例代码 - 在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>()

    {

        //...

    }

}


达令说
浏览 1272回答 4
4回答

暮色呼如

您需要使用反射来获取方法,然后通过使用MakeGenericMethod提供类型参数来“构造”它:MethodInfo method = typeof(Sample).GetMethod("GenericMethod");MethodInfo generic = method.MakeGenericMethod(myType);generic.Invoke(this, null);对于静态方法,将null第一个参数传递给Invoke。这与通用方法无关 - 它只是普通的反射。如上所述,当C#4使用时,很多这样做更简单dynamic- 当然,如果你可以使用类型推断。在类型推断不可用的情况下(例如问题中的确切示例),它没有帮助。
打开App,查看更多内容
随时随地看视频慕课网APP