2015-05-12 3 views
0

У меня есть список динамических объектов. Во время выполнения я хотел бы найти тип объектов в списке, чтобы я мог создать новый список этого типа.Поиск типа динамических объектов в C#

List<dynamic> list1= new List<dynamic>() { new Test() {ID = 1} } 

Я хотел бы знать, что идентификатор типа INT, так что я могу использовать его в Activator.CreateInstance заявлении. Когда я пытаюсь получить тип, используя следующую инструкцию, я всегда получаю «объект»

Type typeInArgument = list1.GetType().GenericTypeArguments[0]; 

Есть ли способ получить этот тип? Я видел некоторые аналогичные вопросы, где было предложено использовать

Type unknown = ((ObjectHandle)list1).Unwrap().GetType(); 

Но это не скомпилировано для Списка.

Мне нужны предложения, чтобы решить эту проблему.

ответ

3

Звучит так, как будто это работает так же хорошо, как возможно.

Поскольку вы используете dynamic, наибольший общий знаменатель элементов списка -object. Просто потому, что у вас есть только один элемент, это не означает, что время выполнения может гарантировать это.

Таким образом, вам, вероятно, понадобится специальный случай, который вы ищете.

Type ret; 
if (list1.Count == 0) 
    ret = typeof(object); 
else 
    ret = list1[0].GetType(); 

Конечно, эта проверка является излишней, если код, который вы нам предоставили, должен восприниматься буквально. Но я надеюсь, что вы это поняли.

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

В общем, похоже, что это не может быть отличным временем для использования dynamic. Если вам нужны анонимные типы, я бы предложил вам перейти к конкретным для этого. Если вы делаете то, что вы здесь делаете, просто введите его как List<Test>.

Конечно, если все, что вы ищете, по сути является клоном этого списка, вы можете это сделать и иметь это право. Я сделал это как foreach для удобства чтения, но LINQ был бы неплохим вариантом здесь.

List<object> ret = new List<object>(); 
foreach (var v in list1) 
{ 
    var type = v.GetType(); 

    ret.Add(/* new instance of type */); 
} 
return ret; 

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

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

2

A List<dynamic> не имеют определенный внутренний тип. Весь смысл dynamic в том, что это может быть что угодно.

Вместо этого вы можете получить тип объекта в списке: list1[0].GetType().
Обратите внимание, что нет гарантии, что следующий элемент имеет тот же тип.

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