2016-07-11 2 views
3

У меня есть список строк с именами классов. Мне нужно создать экземпляры их с помощью Activator, но все они могут быть в разных пространствах имен. Классы могут перемещаться в другое пространство имен в будущем, поэтому я не могу его жестко кодировать.Как найти пространство имен класса по его имени, используя отражение в .net-ядре?

+0

Заблокирован ли вам список 'string', или у вас есть список' Type' вместо? Если у вас есть только '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '? –

+0

К сожалению, я заблокирован. Список классов из текстового файла, и мне нужно создать соответствующие объекты. – MKasprzyk

+0

Обязательно ознакомьтесь с этой темой: [Как получить все классы в пространстве имен?] (Https://stackoverflow.com/questions/949246/how-to-get-all-classes-within-namespace/949285# 949285) –

ответ

4

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

var typenames = new[] { "String", "Object", "Int32" }; 

var types = typeof(object).GetTypeInfo().Assembly 
    .GetTypes() 
    .Where(type => typenames.Contains(type.Name)) 
    .ToArray(); // A Type[] containing System.String, System.Object and System.Int32 

Это не обязательно сломается, если у вас есть несколько типов с тем же именем, но вы получите все из них в списке.

+0

Он не работает с .Net Core. 'Assembly не имеет определения GetAssembly.' – MKasprzyk

+0

Он работает, но вам, возможно, придется добавить зависимость сборки сборки к вашему project.json. Дайте мне несколько минут, и я посмотрю, смогу ли я выяснить, какой из них. –

+0

@MKasprzyk с сетевым ядром вы можете использовать 'typeof (object) .GetTypeInfo(). Assembly' для сборки. –

1

Вы можете получить все типы сборки и найти тот, у кого есть соответствующее имя.

var type = assembly.GetTypes().FirstOrDefault(x => x.Name == name); 

Примечание: название может быть не уникальным. В таком случае у вас нет возможности найти правильный тип, если только вы не можете догадываться о пространстве имен 8e.g. список возможных пространств имен, «черный список» пространств имен и т. д.)

Смежные вопросы