【问题标题】:How to Get Reference to Method from MethodInfo (C#)如何从 MethodInfo (C#) 中获取对方法的引用
【发布时间】:2013-02-20 19:03:56
【问题描述】:

我正在尝试构建一个字典,为类中的每个静态方法编制索引,以便可以使用字符串查找它们。我似乎无法找到一种方法来实际从 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
    }
}

【问题讨论】:

标签: c# reflection


【解决方案1】:

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

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

UPD(转给 Chris Sinclair):

使用示例

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

【讨论】:

  • 也许添加ustor要求的相关代码行:lookup.Add(methodInfo.Name, (SkillEffect)Delegate.CreateDelegate(typeof(SkillEffect), methodInfo));
【解决方案2】:

从代码看来,您正在寻找委托而不是对方法的引用。 (这在 C# 中并不真正存在)

我会将字典更改为Dictionary&lt;string,Func&lt;BattleActor,BattleActor&gt; lookup 尽管这是个人喜好问题,与您的问题无关。 (您可以在下面的代码中将Func&lt;BattletActor,BattlActor&gt; 替换为SkillEffect

然后做

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

lookup.Add(methodInfo.Name,func);

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

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

您可以查看this question 了解更多信息

【讨论】:

  • 他已经这样做了,只是他在代码顶部明确定义了委托,而不是使用Func:delegate void SkillEffect(BattleActor actor, BattleActor target);
  • @ChrisSinclair 他没有创建代表,这是关键。
  • 是的,但为什么不利用他现有的代表而不是将Func&lt;BattleActor, BattleActor&gt; 加入其中?
【解决方案3】:

MethodInfo 是方法的元数据。实际调用您调用的方法(惊喜!)MethodInfo.Invoke。

这能回答你的问题吗?

【讨论】:

    【解决方案4】:

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

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

    然后调用它:

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

    【讨论】:

    • 从技术上讲,C# 中没有函数点(除非你喜欢不安全的代码)所以不,你不能,但我认为 OP 实际上是在谈论委托,你可以从 MethodInfo 对象创建委托跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    相关资源
    最近更新 更多