我正在玩反思。不确定是否有人在此之前提出这个场景:
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
方法设为静态,则呼叫将通过。但是,我不确定如何从静态方法内部调用此调用。
答案 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中,该参数由程序员
显式传递