Предположим, что у меня есть три метода:
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 where T : Stream
, то вызывается версия Stream
.
Есть ли способ отправить вызов метода на перегрузку MemoryStream
на основе открытого типа типа T
?
Я не хочу использовать Delegate.CreateDelegate
или другие API Reflection. Просто в средствах языка С#. Я, вероятно, что-то пропустил внутри самого языка.
Пробовал этот сценарий со значениями типа как закрытый общий тип и использовал статические методы.