2010-12-07 12 views
2

私の目標は、次のコードでdemostratedさ:ジェネリックメソッドは

void MyMethod<T>(T aMethod, params object[] aParams) where T: System.Delegate 
{ 
    aMethod.Invoke(aParams); 
} 

は、どのように私はこの種のものを行うことができますか?

答えて

2

Unconstrained Melodyを使用するか、これを許可するビットを挟むことができます。

一方、実際にはInvokeメソッドが公開されるわけではありません。あなたは何をしたいのですか?

void MyMethod(Delegate aMethod, params object[] aParams) 
{ 
    aMethod.DynamicInvoke(aParams); 
} 

?私は

+0

私は何とかパラメータ型の安全性を得ることを望んでいました。 – Max

+0

@ Max:なぜメソッドを直接呼び出してみませんか?これが本当にあなたを買っているのか分かりません。 –

+0

一般的な例外処理コードを抽出したい。 – Max

0

Tがタイプである必要がありますが、あなたはどのジェネリック

を必要としないなどのパラメータが間違っているタイプのものであってもよいよう、あなたが実際にあっても、一般的なバージョンと安全コンパイル時のなかったであろう、意味しますこのような
void MyMethod(Action<object[]> aMethod, params object[] aParams) 
{ 
    aMethod(aParams); 
} 

void Print(params object[] output) 
{ 
    foreach (var o in output) 
     Console.WriteLine(o); 
} 

呼び出し、それを:

MyMethod(Print, 1, "Hello"); 
+0

これはパラメータを持たないデリゲート(MethodInvoker)では機能しません。 – Max

1

は、私はあなたが実際に達成しようとしているかわからないんだけど:だけコンパイラやランタイムがSystem.Delegateから継承することができますので、どのようなポイントは、ジェネリックを持っています以上:

void MyMethod<T>(System.Delegate aMethod, params object[] aParams) 
{ 
    aMethod.DynamicInvoke(aParams); 
} 

デリゲート型の制約を使用すると面倒なことをしようとしている場合は、http://code.google.com/p/unconstrained-melody/を見ることができます。

それとも、ただAction<object[]>使用 - などAction<T>または過負荷の多くを、Action<T1,T2>

void MyMethod(Action<object[]> aMethod, params object[] aParams) 
{ 
    aMethod(aParams); 
} 

//or 
void MyMethod<T>(Action<T> aMethod, T param) 
{ 
    aMethod(param); 
} 

void MyMethod<T1, T2>(Action<T1, T2> aMethod, T1 param1, T2 param2) 
{ 
    aMethod(param1, param2); 
} 

私が過負荷の巨大なリストを本当に好きではないが、いくつかのケースでは、彼らは最高のライブラリを提供使いやすさ。

関連する問題