2012-03-09 7 views
2

を使用して、オーバーロードされたメソッドを呼び出すと、私はオーバーロードされたメソッドの数を持つクラスを持っている:ジェネリック

public class CustomerCommandHandlers 
{ 

    public void Handler(ChangeNameCommand command) 
    { 
     ... 
    } 

    public void Handler(ChangeAddressCommand command) 
    { 
     ... 
    } 
} 

私は次のメソッドが含まれている:

私からのオーバーロードされたメソッドを呼び出すことができます
public void Handle<TCommand>(TCommand command) where TCommand : ICommand 
    { 
     Handler((dynamic)command); 
    } 

をコマンドとコマンドハンドラを登録する別のクラス。

しかし、私はProductCommandHandlers、InventoryCommandHandlersなどの他のcommandHandlerを作成するので、私は各クラスに動的メソッドを含めたくありません。

このメソッドを含むすべてのコマンドハンドラの基本クラスを作成する方法はありますか?そして、このメソッドを基本クラスから呼び出すことはできますか?

おかげ

答えて

4

すでにダイナミクスを使用している場合は、同様の基本クラスとしてこれを試してみてください:

public class Basehandler 
{ 
    public void Handle<TCommand>(T command) where TCommand : ICommand { 
     ((dynamic)this).Handler(command); 
    } 

    // As fallback if there is no implementation for the command type 
    public void Handler(ICommand val) { 
     // You could implement default or error handling here. 
     Console.WriteLine(val == null ? "null" : val.GetType().ToString()); 
    } 
} 
+1

絶対に華麗な。まさに私が探していたもの。フォールバックは何ですか? –

+0

動的なので、パラメータのタイプの実装があるかどうかはわかりません。 CommandThatYouHaveNoHandlerForを渡すと、RuntimeBinderExceptionが発生します。どちらかを処理するか、フォールバックハンドラを使用して独自のデフォルト処理を実装します。 EDIT:あなたの例に合った答えを修正しました – Botz3000

+0

ありがとうございました。 –