使用反射从Main调用泛型方法

时间:2015-09-18 01:30:28

标签: c#

我正在玩反思。不确定是否有人在此之前提出这个场景:

    static void Main(string[] args)
    {

        MethodInfo definition = typeof(SafeClass).GetMethod("Print");
        MethodInfo constructed = definition.MakeGenericMethod(typeof(int));
        constructed.Invoke(null, null);

        Console.ReadLine();
    }

public class SafeClass
{
    public void Print<T>()
    {
        Console.WriteLine(typeof(T));
    }
}

我收到错误Non-static method requires a target.

如果我将Print方法设为静态,则呼叫将通过。但是,我不确定如何从静态方法内部调用此调用。

4 个答案:

答案 0 :(得分:3)

你基本上做的相当于下面的事情,但由于显而易见的原因,它们不会起作用。

null.Print<int>();

您打算使SafeClass.Print<T>()为静态,或者您需要SafeClass的实例来调用该方法:

var mySafeClass = new SafeClass();
constructed.Invoke(mySafeClass, null);

答案 1 :(得分:2)

Print<T>()是一个实例方法,而不是静态方法。它需要在某些东西上调用。

例如,代码为:

var sc = new SafeClass();
sc.Print<int>();

就像你不能简单地这样做:

Print<int>();

你也不能做反思。要么打印静态,要么将代码更改为:

MethodInfo definition = typeof(SafeClass).GetMethod("Print");
MethodInfo constructed = definition.MakeGenericMethod(typeof(int));
constructed.Invoke(new SafeClass(), null);

Console.ReadLine();

答案 2 :(得分:0)

它说它需要一些实例才能完成对此方法的调用。我也动态创建了对象。因此,如果包含该方法,则可以运行任何对象。

static void Main(string[] args)
    {
        object test=  Activator.CreateInstance(typeof(SafeClass));     
        MethodInfo definition = typeof(SafeClass).GetMethod("Print");
        MethodInfo constructed = definition.MakeGenericMethod(typeof(int));
        constructed.Invoke(test, null);
        Console.ReadLine();
    }

答案 3 :(得分:0)

如果方法是实例方法或构造函数,则Invoke的第一个参数应该是它自己的实例。

这是因为在调用实例方法或构造函数时,clr会将实例作为第一个参数传递给函数,以便您可以在方法中使用this

在其他语言如python中,该参数由程序员

显式传递