1

私が基本的にやりたいことは、GetHandler<T>を返すというメソッドを持つことAction<T>です。C# 構文ではこれが可能ですが、正直なところ、そのようなメソッドをどのように実装する必要があるのか​​ わかりません。

T の型に基づいて別の関数を返したいので、現在の試行は次のようになります。

    public override Action<T> GetHandler<T>()
    {
        if (typeof(T) == typeof(MyType))
        {
            return delegate (T t)
            {
                var msg = (MyType)t;
                //do stuff
            }
        }
        return null;
    }

に変換できないため、これは機能しませTMyTypedelegate (MyType msg)もちろんサインも違うので返品もできません。

この状況で理想的なのは、C# でジェネリック メソッドの複数のオーバーライドを許可し、個別の入力に対して個別のハンドラーを指定してから、他のすべてを処理するキャッチオール オーバーライドを許可することです。ただし、キャッチオールワンをどのように実装するかはまだわかりません。

では、この機能にできるだけ近づけるために何をすることをお勧めしますか? 私の見方では、T は有用なものにキャストできないため、私の関数はほとんど何もできません。

このメカニズムの使用例を次に示します。

上記の動作を実装するインスタンスのコレクションを持つクラスがあります。このクラスにはメソッドがありSendMessage<T>ます。このメソッドは、含まれているすべてのインスタンスをGetHandler<T>()調べてそれらを呼び出し、結果が null かどうかをチェックし、そうでない場合はハンドラーにメッセージを送信します。

4

3 に答える 3

1

これが役立つかどうかはわかりませんが、ジェネリックを制約することだけを考えましたか?

public override Action<T> GetHandler<T>()
    where T : SomeType // Constrain to some type/interface
{
    // You can treat T like SomeType here
}

このようにして、少なくとも T を次のように扱うことができSomeTypeます。そうでない場合は、あなたが達成しようとしていることをよりよく理解できるように、使用例を挙げていただけますか?

于 2013-09-24T22:46:15.690 に答える
1

次のようなことをしないのはなぜですか:

private void HelloMessageHandler(      HelloMessage      msg ) { ... }
private void GoodByeMessageHandler(    GoodByeMessage    msg ) { ... }
private void HowYaDoingMessageHandler( HowYaDoingMessage msg ) { ... }
.
.
.
public Action<T> GetHandler<T>()
{
  Type t = typeof(T) ;
  Delegate handler ;

  if      ( t == typeof(HelloMessage)      ) handler = (Action<HelloMessage>)      HelloMessageHandler      ;
  else if ( t == typeof(GoodByeMessage)    ) handler = (Action<GoodByeMessage>)    GoodByeMessageHandler    ;
  else if ( t == typeof(HowYaDoingMessage) ) handler = (Action<HowYaDoingMessage>) HowYaDoingMessageHandler ;
  else
  {
    string message =  string.Format( "Unknown Message Type specified: {0}" , t.FullName ) ;
    throw new InvalidOperationException(message);
  }

  Action<T> instance = (Action<T>) handler ;
  return instance ;
}

私にはかなり簡単に思えます。

于 2013-09-24T23:28:43.860 に答える