4

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

4 回答 4

3

尝试使用 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));
于 2013-02-20T19:10:09.120 回答
2

从代码看来,您正在寻找委托而不是对方法的引用。(这在 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);

您可以查看此问题以获取更多信息

于 2013-02-20T19:13:25.497 回答
0

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

这是否回答你的问题?

于 2013-02-20T19:07:39.587 回答
0

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

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

然后调用它:

lookup[methodName].Invoke(null, BindingFlags.Public | BindingFlags.Static, null, args, null);
于 2013-02-20T19:10:29.790 回答