Как получить открытый универсальный тип из строки - PullRequest
3 голосов
/ 01 июня 2011

У меня есть массив Type [], и я хочу получить тип Func, где T1, T2 и т. Д. Соответствуют типам в массиве. Размер массива не фиксированный, но предполагается, что тип доступен во время выполнения (16 в .NET 4, 4 в .NET 3.5).

В .NET 4 я могу сделать это, и это работает:

Type GetFuncType(Type typeRet, Type[] types)
{
    return Type.GetType(string.Format("System.Func`{0}", types.Length + 1))
                  .MakeGenericType(types.Concat(new Type[] { typeRet } ).ToArray())
}

В .NET 3.5, однако, Type.GetType для открытого универсального типа завершается ошибкой, возвращая NULL.

Есть ли способ заставить эту работу работать в .NET 3.5? Моя единственная мысль - создать строку для близкого универсального типа.

Ответы [ 2 ]

4 голосов
/ 01 июня 2011

Предпочтительный способ сделать это - использовать Expression.GetFuncType(Type[]) и Expression.GetActionType(Type[]).В случае func, последним Type является возврат, поэтому:

Array.Resize(ref types, (types == null ? 0 : types.Length) + 1);
types[types.Length - 1] = typeRet;
return Expression.GetFuncType(types);
0 голосов
/ 01 июня 2011

Я принял ответ Марка на это, потому что это, очевидно, правильный способ сделать это в этом случае. Однако в то же время я разработал другое решение, которое может пригодиться в других случаях.

Проблема с моим первоначальным подходом была связана с тем, что имя типа Func` {0} не было квалифицировано со ссылкой на сборку. Таким образом, альтернативное исправление, которое я нашел, было следующим (опечатки не выдержали):

typeof(Func<>).Assembly.GetType(string.Format("Func`{0}", types.Length+1));

typeof(Func<>).Assembly - это хак, чтобы получить ссылку на сборку, которая реализует типы Func.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...