如何调用MethodInfo?

时间:2011-12-14 20:50:29

标签: c# .net reflection

我有一个MethodInfo对象,它定义了我想要调用的方法。

除非我需要object来自的MethodInfo

伪码:

void CallMethod(MethodInfo m)
{
    Object o = Activator.CreateInstance(m.ClassType);
    o.GetType().InvokeMember(m.Name, BindingFlags.InvokeMethod, null, o, null);
}

除非我不知道如何获得type所属的班级MethodInfo

如何拨打MethodInfo

4 个答案:

答案 0 :(得分:5)

MethodInfo 知道方法调用的目标 - MethodInfo实际上属于类型,而不是一个特定的对象

您需要有一个目标类型的实例来调用该方法。您可以使用MethodInfo.DeclaringType(继承自MemberInfo.DeclaringType)轻松找到类型,但此时您可能没有实例...

正如里德所指出的,MemberInfo.ReflectedType可能比DeclaringType更合适,具体取决于您计划如何使用它。

您尚未解释有关您正在做什么的任何内容,但如果您的设计的其余部分可以适当更改,那么采用Action代理而不是MethodInfo可能更合适

答案 1 :(得分:2)

这将从MethodInfo所属的类型创建一个对象,并将在该新对象上为您调用它。

void CallMethod(MethodInfo m)
{
    Object o = Activator.CreateInstance(m.ReflectedType);
    m.Invoke(o, null);
}

答案 2 :(得分:0)

您可以通过访问MethodInfo对象的DeclaringType属性来确定定义方法的类型。

答案 3 :(得分:0)

我可能误解了这个问题,但听起来你是在委托而不是MethodInfo之后。

void Main()
{
    Object myObject = new ArrayList();
    MethodInfo methodInfo = myObject.GetType().GetMethod("Clear");
    Delegate method = Delegate.CreateDelegate(typeof(Action), myObject, methodInfo, true);
    CallMethod(method);
}

void CallMethod(Delegate method)
{
    method.DynamicInvoke();
}

在这种情况下,显然有一种更简单的方法来获取委托(method = new Action(myObject.Clear)),但我正在讨论需要使用MethodInfo对象的问题。