2013-05-03 3 views
6

は考える:派生クラスを持つアクション<in T>をアクションパラメータとして渡す方法はありますか?

class BaseClass {} 
class DerivedClass : BaseClass {} 

を私はBaseClassのパラメータを指定してアクションを受け入れることができる機能を書きたいです。この関数は、指定された型のオブジェクトを作成し、それをActionに渡します。

void MyFunction(Type type, Action<BaseClass> DoAction) 
{ 
    BaseClass obj = (BaseClass)Activator.CreateInstance(type); 
    DoAction(obj); 
} 

私は、そのパラメータDerivedClassあるAnotherFunctionに渡したい:

void AnotherFunction(DerivedClass x) 
{ 
} 

私はMyFunctionを呼び出す必要がありますどのように?以下が原因AnotherFunction引数に無効です:

MyFunction(typeof(DerivedClass), AnotherFunction); 

答えて

11

すべての可能で、代わりにジェネリックを使用しようとすると:

void MyFunction<T>(Action<T> DoAction) where T : BaseClass, new() 
{ 
    DoAction(new T()); 
} 

を次にあなただけ書くことができます。

MyFunction<DerivedClass>(AnotherFunction); 

この意志:

  • コンパイル時間のチェック使用するタイプがBaseClassまたはそれから派生するタイプであることを確認してください。タイプがBaseClassを拡張しないため、ランタイムエラーは発生しません。
  • 実行時に例外がスローされるのではなく、その型にパラメータのないコンストラクタがあることを確認するためにコンパイル時間チェックを行います。
  • Actionに提供されたメソッドが、型が適切でない場合に実行時に例外をスローするのではなく、使用された型に適したパラメータを受け入れることを確認するためにコンパイル時間チェックを行います。
+0

+1あなたは私の編集に勝つ。 –

+1

私はMyFunction(AnotherFunction)は明示的にジェネリック引数の型を指定せずにコンパイルされないと思います。 – jure

+0

@ jureあなたは正しいです、それはタイプを推論することはできません。 – Servy

関連する問題