У меня есть еще один неприятный момент с Reflection.Emit
и типом управления.
Скажем, у меня есть тип с именем MyType
, который определен в динамически сгенерированной сборке.
Вызов MyType.GetMethods()
приводит к NotSupportedException
, что привело меня к написанию моего собственного набора оберток и поисковых таблиц. Тем не менее, то же самое происходит, когда я вызываю GetMethods()
или любые другие методы интроспекции стандартных типовых типов, которые используют мои собственные типы в качестве общих аргументов:
-
Tuple<int, string>
= > отлично работает -
Tuple<int, MyType>
= > исключение
Я могу получить список методов из определения общего типа:
typeof(Tuple<int, MyType).GetGenericTypeDefinition().GetMethods()
Однако у методов есть общие заполнители вместо фактических значений (например, T1
, TResult
и т.д.), и мне не хочется писать еще один kludge, который отслеживает общие аргументы обратно к их исходным значениям.
Образец кода:
var asmName = new AssemblyName("Test");
var access = AssemblyBuilderAccess.Run;
var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, access);
var module = asm.DefineDynamicModule("Test");
var aType = module.DefineType("A");
var tupleType = typeof(Tuple<,>);
var tuple = tupleType.MakeGenericType(new [] { typeof(int), aType });
tuple.GetProperty("Item1"); // <-- here the error
Итак, вопросы:
- Как определить, безопасен ли тип для вызова
GetMethods()
и аналогичных методов? - Как получить фактический список методов и их общие значения аргументов, если тип небезопасен?