如何从MethodInfo(C#)中获取对方法的引用

本文关键字:获取 方法 引用 MethodInfo | 更新日期: 2023-09-27 18:00:15

我正在尝试构建一个字典,为类中的每个静态方法建立索引,以便用字符串查找它们。我似乎找不到从MethodInfo中实际获取对该方法的引用的方法。这可能吗?

delegate void SkillEffect(BattleActor actor, BattleActor target);
public static class SkillEffectLookup
{
    public static Dictionary<string, SkillEffect> lookup;
    public static void Build()
    {
        lookup = new Dictionary<string, SkillEffect>();
        Type type = typeof(SkillEffects);
        var methods = type.GetMethods(BindingFlags.Static | BindingFlags.Public);
        foreach (MethodInfo methodInfo in methods)
        {
            lookup.Add(methodInfo.Name, _____________);
        }
    }
public static class SkillEffects
{
    public static Attack(BattleActor actor, BattleActor target)
    {
        // Do Things
    }
    public static NonAttack(BattleActor actor, BattleActor target)
    {
        // Do Other Things
    }
}

如何从MethodInfo(C#)中获取对方法的引用

尝试使用CreateDelegate方法。只有当您知道方法的签名时,它才会起作用。

http://msdn.microsoft.com/en-us/library/system.delegate.createdelegate.aspx

UPD(tnx给Chris Sinclair):

使用的示例

lookup.Add(methodInfo.Name
      , (SkillEffect)Delegate.CreateDelegate(typeof(SkillEffect), methodInfo));

从代码中可以看出,您正在寻找一个委托,而不是对方法的引用。(在C#中并不存在)

我会把字典改成Dictionary<string,Func<BattleActor,BattleActor> lookup尽管这是个人偏好的问题,与你的问题无关。(您可以在以下代码中将Func<BattletActor,BattlActor>替换为SkillEffect

然后做

Func<BattleActor,BattleActor> func = (Func<BattleActor,BattleActor>)
                     Delegate.CreateDelegate(typeof(Func<BattleActor,BattleActor>), methodInfo);
lookup.Add(methodInfo.Name,func);

函子是一个委托,可以像任何其他委托一样调用

 lookup["mymethod"](actor,target);

您可以看到这个问题以获得更多信息

MethodInfo是该方法的元数据。要实际调用您调用的方法(惊奇!)MethodInfo.invoke.

这能回答你的问题吗?

如果您希望保存对方法本身的引用以便可以调用它,我认为您不能。实际上,您所做的是通过MethodInfo:上的Invoke方法调用它

        foreach (MethodInfo methodInfo in methods)
        {
            lookup.Add(methodInfo.Name, _____________);
        }

然后称之为:

lookup[methodName].Invoke(null, BindingFlags.Public | BindingFlags.Static, null, args, null);