3

次のように宣言されたクラスがあるとします。

public class ExampleClass 
{
   public Action<int> Do { get; set; }

   public ExampleClass()
   {
   }

   public void FuncA(int n)
   {
       //irrelevant code here
   }

   public void FuncB(int n)
   {
       //other irrelevant code here
   }
}

このクラスをこんな風に使えるようになりたい

ExampleClass excl = new ExampleClass() { Do = FuncA }

また

ExampleClass excl = new ExampleClass() { Do = excl.FuncA }

また

ExampleClass excl = new ExampleClass() { Do = ExampleClass.FuncA }

そこで2番目のオプションをコンパイルできますが、"Delegate to an instance method cannot have null 'this'."そのコードをヒットすると例外が発生します。FuncAは静的ではないため、3番目のものは意味がありません。

私の実際のコードでは、10〜15の異なる関数が関連付けられる可能性があり、いつでもそれらを追加または削除できるため、大きなスイッチやit-elseステートメントは必要ありません。 。さらに、クラスをインスタンス化するときに「Do」に値を割り当てることができると非常に便利です。

間違った構文を使用していますか?クラスを作成して1行でアクションを割り当てるより良い方法はありますか?巨大なswitchステートメントを管理する必要がありますか?

4

3 に答える 3

3

クラスのインスタンスを作成し、後でプロパティをインスタンス メンバーに設定する必要があります。何かのようなもの:

ExampleClass excl = new ExampleClass();
excl.Do = excl.FuncA;

回線の場合:

ExampleClass excl = new ExampleClass() { Do = FuncA }

FuncA は、クラスのインスタンスなしでは表示されません。

為に:

ExampleClass excl = new ExampleClass() { Do = excl.FuncA }

インスタンスがまだ作成されていないため、null 参照の例外が発生しています。

為に:

ExampleClass excl = new ExampleClass() { Do = ExampleClass.FuncA }

FuncAは静的メソッドではないため、クラス名でアクセスすることはできません。

于 2012-12-21T06:03:16.893 に答える
2

オブジェクト初期化構文では、確実に割り当てられる前に初期化されている変数にアクセスすることはできません。

ExampleClass excl = new ExampleClass() 
{ 
    Do = excl.FuncA //excl is unavailable here
}

詳細については、オブジェクトとコレクションのイニシャライザー(C#プログラミングガイド)を参照してください。


たとえば、次のようにすることができます。

public class ExampleClass
{
    public Action<int> Do { get; set; }

    public ExampleClass(bool useA)
    {
        if (useA)
            Do = FuncA;
        else
            Do = FuncB;
    }

    public void FuncA(int n)
    {
        //irrelevant code here
    }

    public void FuncB(int n)
    {
        //other irrelevant code here
    }

}

そしてそれを使用します:

 ExampleClass exclA = new ExampleClass(true);
 ExampleClass exclB = new ExampleClass(false);

別のアイデアは、これらの関数がとして宣言される可能性がある場合static(つまり、のインスタンスメンバーを必要としない場合ExampleClass)、これは機能します。

public class ExampleClass
{
    public Action<int> Do { get; set; }

    public ExampleClass() { }

    public static void FuncA(int n) { /*...*/}

    public static void FuncB(int n) { /*...*/}
}

そしてそれをあなたが望むように使用してください:

ExampleClass excl = new ExampleClass() { Do = ExampleClass.FuncA };
于 2012-12-21T06:03:50.527 に答える