我似乎无法弄清楚如何从反射中调用非静态方法(实例方法)。我究竟做错了什么?真的很新/无知与反思(如果你没有注意到):
示例:
class Program
{
static void Main()
{
Type t = Type.GetType("Reflection.Order" + "1");
var instance = Activator.CreateInstance(t);
object[] paramsArray = new object[] { "Hello" };
MethodInfo method = t.GetMethod("Handle", BindingFlags.InvokeMethod | BindingFlags.Public);
method.Invoke(instance, paramsArray);
Console.Read();
}
}
public class Order1
{
public void Handle()
{
Console.WriteLine("Order 1 ");
}
}
答案 0 :(得分:7)
你有两个问题:
您的BindingFlags不正确。它应该是:
MethodInfo method = t.GetMethod("Handle", BindingFlags.Instance | BindingFlags.Public);
或者您可以一起删除绑定标记并使用默认绑定行为,在这种情况下可以使用。
声明的Handle
方法接受零参数,但您使用一个参数("Hello"
)调用它。将一个字符串参数添加到Handle:
public void Handle(string something)
{
Console.WriteLine("Order 1 ");
}
或者不传递任何参数。
答案 1 :(得分:4)
你应该使用
BindingFlags.Instance | BindingFlags.Public
致电GetMethod()
。
BindingFlags.InvokeMethod
未使用 GetMethod()
(和其他调用标志)。你可以在the documentation for Type.InvokeMember()
中看到它的含义。
答案 2 :(得分:3)
您需要加入BindingFlags.Instance
。
答案 3 :(得分:1)
除了已经提到的绑定标志之外,您似乎试图将参数传递给不带任何参数的方法。