2009-04-13 7 views
8

パラメータ型に基づいて動的な戻り値型を持つ関数を作成するにはどうすればよいですか?関数の動的戻り型

protected DynamicType Test(DynamicType type) 
{ 

return ; 

} 

答えて

26

これにジェネリックを使用する必要があります。たとえば、この例では

protected T Test<T>(T parameter) 
{ 

} 

は、「<T>」は、型の名前を表しコンパイラに指示しますが、それは、この関数を作成するコンテキストにあるかわかりません。

protected int Test(string p) { ... } 
protected string Test(DateTime p) { .... } 
1

同様

は、その後、あなたはジェネリックを使用する必要があります。

protected T Test(T type) { 

return type; 

} 
+0

@Shikoは、実際に、これはアダムの答えの前に来ました。 – uchamp

+0

@champ私の悪い、私は私のコメントを削除します – Shiko

5

実は、あなたはパラメータの既知のセットを持っており、型を返すと仮定し、それは簡単なオーバーロードで扱うことができ、それを呼び出してしまうと思います動的言語ではありません。 C#でこの問題に取り組むには、一般的なオブジェクトを返すことができますし、後で値が必要であると思われるものに型変換します。インタフェースを返すこともできます。このようにして、特定のクラスインスタンスを本当に気にする必要はありません。他の人が指摘しているように、ジェネリックを使うこともできます。上記のすべてのメソッドには独自の制限があるため、実際には関数の本体の中で何をしたいか/したいかによって異なります。

+0

ここでの問題は、呼び出し元が呼び出し前に型を知らない場合です。たとえば、stringまたはintのどちらか一方だけが有効です。 – rolls

+0

@rolls - もちろん彼はそうです。彼は特定の型の変数(または定数)をメソッドに渡しています。彼は戻り値を特定の型の変数に入れています。彼は明らかに異なるタイプの異なる場所で同じ方法を使いたいと思っています。 –

+0

この例ではYesです。私は一般的にもっと話していました。 – rolls

1

のC#:だからあなたのような...

int foo; 

int bar = Test<int>(foo); 
+4

C#は動的になっています。 「動的」タイプを使用します。 –

13

受け入れ答えは、私はあなたが使用できることを追加する必要があり、それはそれが書かれてから2年以上経過している、良いですので、なくなり:

protected dynamic methodname(dynamic input) 
{ 
    return input; 
} 

入力が同じタイプとして返​​され、あなたされますメソッドをジェネリックとして呼び出す必要はありません。

参考:あなたはタイムスタンプを見れば
https://msdn.microsoft.com/en-us/library/dd264736.aspx

+4

また、受け入れられた答えがジェネリック型の推論を使うこともできるので、ジェネリック型の推論を明示的に指定する必要はなく、 'Test(foo)'と呼ぶことができます。 –

+0

@AdamRobinsonありがとう...ジェネリックは私の強みではなく(まだ!)、私はまだ学んでいます - ダイナミック関数についての質問を書こうとしていました。 – Wil

+0

両方とも入力のためにありがとう、私はそれが自分自身を使用していると私は参照してください – DevMania