Есть ли способ найти объявленный тип общего аргумента экземпляра делегата Action?
В следующем коде функция WriteGenericArgumentType
ожидает и экземпляр Action<String>
, но, поскольку Action<in T>
допускает, что вызывающие контравариантности функции могут вызывать ее с помощью Action<Object>
.
static void Main( )
{
WriteGenericArgumentType( new Action<string>( s => { } ) );
WriteGenericArgumentType( new Action<object>( o => { } ) );
}
static void WriteGenericArgumentType( Action<string> action )
{
Console.WriteLine( DiscoverGenericArgumentType( action ).Name );
}
static Type DiscoverGenericArgumentType( Delegate action )
{
return action.GetType().GetGenericArguments()[0];
}
Однако мне нужно иметь возможность обнаружить общий тип аргумента, который был определен в сигнатуре WriteGenericArgumentType
из экземпляра делегата, который передается в DiscoverGenericArgumentType
.
Когда код запускается, я получаю следующий вывод:
String
Object
Но мне нужно, чтобы это было:
String
String
Для моих целей я не могу изменить сигнатуру DiscoverGenericArgumentType
, и мне нужна эта функция для возврата string
в качестве типа.
Я знаю, что могу создать свой собственный тип общего делегата, который не допускает контравариантности, но я ищу способ не менять сигнатуру API, если это возможно.
Есть идеи?