3

それぞれがアクションに対応する値のコレクションを作成しようとしています。このようにして、コレクションで特定の値を検索し、関連するアクションを一般的な方法で呼び出すことができます。

だから、これが私の最初の刺し傷でした:

public class CommandInfo
{
    public string Name { get; set; }
    public Action<RunArgument> Action { get; set; }
}

public class MyClass
{
    public List<CommandInfo> Commands = new List<CommandInfo>
    {
        new CommandInfo { Name = "abc", Action = AbcAction } // <== ERROR HERE
    };

    public void AbcAction(RunArgument arg)
    {
        ; // Do something useful here
    }
}

この場合、コレクションCommandInfo内でnewを宣言すると、Commands次のエラーが発生します。

フィールド初期化子は、非静的フィールド、メソッド、またはプロパティ'MyNameSpace.MyClass.AbcAction(MyNameSpace.RunArgument)'を参照できません。

確かに、このような非静的メソッドへの参照を格納する方法が必要です。誰かが私を助けることができますか?

4

2 に答える 2

6

確かに、このような非静的メソッドへの参照を格納する方法が必要です。誰かが私を助けることができますか?

フィールド初期化子内だけではありません。したがって、これはうまく機能します:

public List<CommandInfo> Commands = new List<CommandInfo>();

public MyClass()
{
    Commands.Add(new CommandInfo { Name = "abc",
                                   Action = AbcAction });
}

... または、コンストラクター内で割り当て全体を実行します。これは実際にはデリゲートとは何の関係もないことに注意してください。これは、効果的に参照していることに基づいて、付随的なものですthis.AbcAction。他のすべての方法では、次の問題と同等です。

public class Foo
{
    int x = 10;
    int y = this.x; // This has the same problem...
}

(もちろん、実際に公開フィールドがないことを願っています...)

于 2012-10-09T21:11:46.193 に答える
5

問題は、非静的メンバーへの参照を格納できないことではなく、フィールド初期化子で非静的メンバーを参照できないことです。フィールド初期化子は、静的値または定数値のみを参照できます。の初期化をCommandsコンストラクターに移動すると、機能します。

public class CommandInfo
{
    public string Name { get; set; }
    public Action<RunArgument> Action { get; set; }
}

public class MyClass
{
    public List<CommandInfo> Commands;

    public MyClass 
    {
        Commands = new List<CommandInfo>
        {
            new CommandInfo { Name = "abc", Action = AbcAction }
        };
    }

    public void AbcAction(RunArgument arg)
    {
        ; // Do something useful here
    }
}
于 2012-10-09T21:11:20.380 に答える