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 に答える