2012-05-02 7 views
2
delegate IEnumerable<T> GetFromSQLDelegate<T>(...); 
public GetFromSQLDelegate myFunctionToCall; 

myFunctionToCallで型が指定されていないため、上記はコンパイルされません。私は、通常の一般的な機能として、後でそれを呼び出すことができるように、一般的なデリゲート「ストア」にしようとしている:私は、デリゲートの保存性の具体的なタイプを指定していないよので汎用代理人の保管と使用

// ... somewhere in another code base ... 
return MyObject.myFunctionToCall<string>(...); 

C#は文句を言います。さまざまな具体的な型代理シナリオを実装せずにジェネリック関数を呼び出すことができるデリゲートを「格納」する(良い)方法はありますか?あなたは、System.Delegateとして値を格納し、それprivate行い、適切な型に保存されたデリゲートをキャストする機能GetDelegate<T>を定義することができ

答えて

4

private Delegate storedDelegate; 

public myFunctionToCall<T> GetDelegate<T>() { 
    return (myFunctionToCall<T>)storedDelegate; 
} 

あなたは、このようにそれを呼び出すことができます。

return MyObject.GetDelegate<string>()(...); 

()(...)シンタックスのあちこちで醜いことが少しありますが、それはおそらくトリックです。

+2

元々代理人に割り当てられていた関数に使用された型にTが一致しない場合、キャストがどのように動作するかわかりません。または、実際にデリゲートに値を割り当てる方法がありませんか? –

+1

代理人を非公開にする(dasblinkenlightによって明示的に呼び出される)ことによって、送信者だけが代理人を「設定」することができ、すべての消費者が代理人を取得できる(ただし設定することはできません)動作する署名の消費者。このパターンは、送信者がデリゲートをデリゲートを呼び出す関数に一致させることができない場合にのみ失敗します。 –

+0

あなたのソリューションは完璧ではありません(ボクシング/アンボクシングが含まれているため)が、デザインに妥協することなく得ることができるほど近くに表示されます。ありがとうございました。 :) –

0

あなたのパズルへのピースがC#ではありません。

  • あなたは、このような想像に一致する関数を作成することはできません非指定された型
  • でジェネリック型の非ジェネリック変数を持つことができません署名
  • 関数を呼び出して型を指定することはできません。

答えはNOです。同様の行動を達成するには複数の異なる方法があります。したがって、実際の目標が何であるかを指定すると、誰かがアプローチを思いつきます。

+0

問題が暗示するように、私は関数の参照をオブジェクトに格納しようとしています。オブジェクトの参照は、その関数を呼び出すために他のオブジェクト(送信オブジェクトについてはわからないオブジェクト)に渡されます。オブジェクトが共通に持つ唯一のことは、関数の署名に関する契約です。なぜこの機能が存在しないのか、存在しないのか分かりません。タイプの安全性を損なうべきではないからです。基本的な要件は、送信者がデリゲートのコンシューマに自身(公開または非公開)を公開することなく、関数を指定する必要があることです。 –

+0

ジェネリック関数の型を「ストリップ」したいと思っています。ジェネリック型は関数のシグネチャの一部です...あなたが望むものを消化しようとしています。 –

+0

あなたは@ dasblinkenlightソリューションに満足しているようです - 要件に関する有用なコメントがあるので、この答えを保持してください。 –

関連する問題