Создайте универсальный тип посредством отражения, учитывая тип другого объекта - PullRequest
0 голосов
/ 18 декабря 2018

Я передаю тип методу и создаю объект на основе этого типа.Предположим, что argType является Type и передается методу в качестве параметра.

var assembly = AppDomain.CurrentDomain.GetAssemblies().Single(a => a.GetName().Name == "MyAssembly");
var newType = assembly.GetTypes().SingleOrDefault(x => x.FullName == argType.FullName + "Suffix");
var newObject = Activator.CreateInstance(newType);

Это прекрасно работает для большинства объектов, но если я передам тип с универсальным подтипом (например, MyClass<MyType>)), это не удается [Предположим, что цель состоит в том, чтобы установить newObject в MyClassSuffix<MyType>].

Как можно улучшить приведенный выше код, чтобы можно было также создавать универсальные типы (заканчивающиеся на «Суффикс»)?Я посмотрел на свойство FullName для таких типов, которые содержат подстроки, такие как '1[[.Я бы предпочел не выполнять синтаксический анализ регулярных выражений, чтобы добавить «Суффикс» до начала этих символов.Я думаю, что есть лучший способ.

1 Ответ

0 голосов
/ 18 декабря 2018

Вы можете использовать метод MakeGenericType, если у вас есть экземпляр обоих типов, то есть универсальный класс и параметр универсального типа:

// assuming you have a generic class named Class<> 
// taking one generic type parameter
Type generic = typeof(MyClassSuffix<>);
Type typeParameter = typeof(MyClass);
Type genericInstance = generic.MakeGenericType(typeParameter);

, а затем:

object o = Activator.CreateInstance(genericInstance);

В вашемЕсли у вас generic как newType, и вам необходимо выяснить, какой тип нужно передать в качестве параметра типа, и он должен работать.

Прочитайте следующие Документы MSDN для получения подробной информации.инструкции по этой теме:

https://docs.microsoft.com/en-us/dotnet/framework/reflection-and-codedom/how-to-examine-and-instantiate-generic-types-with-reflection

UDPATE:

Вы также можете получить параметры универсального типа следующим образом

    var newType = assembly.GetTypes().SingleOrDefault(x => x.FullName == argType.FullName + "Suffix");
     if(newType.IsGenericType)
     {
        // Get the generic type parameters or type arguments.
        Type[] typeParameters = t.GetGenericArguments();

        // Construct the type Dictionary<String, Example>.
        Type constructed = newType.MakeGenericType(typeParameters);
     }

Еслиу вас есть закрытый тип, тогда вы можете создать его экземпляр так же, как обычный класс.См. Следующий пример:

public class GenericClass<Int>
{

}

Теперь мы можем сгенерировать его экземпляр, например:

 Type t = typeof(GenericClass<int>);
 object o = Activator.CreateInstance(y);
 Console.WriteLine(o);

DEMO Fiddle

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