次の 3 つの方法があるとします。
void Foo(MemoryStream v) {Console.WriteLine ("MemoryStream");}
void Foo(Stream v) {Console.WriteLine ("Stream");}
void Foo(object v) {Console.WriteLine ("object");}
Foo
オープン ジェネリック型の最初のパラメーターを渡すメソッドを呼び出します。
void Bar<T>()
{
Foo(default(T)); //just to show the scenario
//default(T) or new T() doesn't make a difference, null is irrelevant here
}
オーバーロードを呼び出したいMemoryStream
ので、ジェネリック型のメソッドBar
をMemoryStream
次のように閉じます。
Bar<MemoryStream>();
しかし、object
オーバーロードが呼び出されます。Foo signature に一般的な制約を追加するとwhere T : Stream
、Stream
バージョンが呼び出されます。
MemoryStream
オープンジェネリック型に基づいて、メソッド呼び出しをオーバーロードにディスパッチする方法はありT
ますか?
Delegate.CreateDelegate
または他の Reflection APIを使用したくありません。C#言語の手段で。おそらく、言語自体に何かが欠けているのでしょう。
閉じたジェネリック型として値型を使用し、静的メソッドを使用して、このシナリオを試しました。