2016-12-22 5 views
1

У меня есть список, тип объекта будет найден только во время выполнения через отражение. Но когда я пытаюсь назначить список фактическому объекту, он бросает ошибку, поскольку «объект не может быть преобразован». Ниже приведен код,Динамически конвертировать Список <Object> в список <Customer>

var obj = new List<Object>(); 
obj.Add(cust1); 
obj.Add(Cust2); 
Type newType = t.GetProperty("Customer").PropertyType// I will get type from property 
var data= Convert.ChangeType(obj,newType); //This line throws error` 
+1

'Тип т = t.GetProperty ("Клиент") PropertyType // я получить тип из property' - вы определяете переменную и используете переменную одновременно. Это не имеет смысла. – StriplingWarrior

+0

Почему * точно * вам нужен «Список '? Из описания кажется, что вы хотите преобразовать «Список » в «Список ', где 'T' определяется во время выполнения, но тогда' data' должен будет иметь тип 'object', потому что он может содержать любые 'Список '. Это делает ваш код еще более слабо типизированным. –

+0

Что-то вроде этого ?: 'Список Клиенты = obj.Select (O => (Клиент) O.GetType(). GetProperty (« Клиент »). GetValue (O, null)). ToList();' – Fruchtzwerg

ответ

3

Ваш obj объект IST не Customer, это List из Customer. Таким образом, вы должны получить тип это так:

var listType = typeof(List<>).MakeGenericType(t); 

Но вы не можете преобразовать свой объект в этом listType, вы получаете Exception, что List не реализует интерфейс IConvertible.

Решение: просто создать новый список и скопировать все данные на него:.

object data = Activator.CreateInstance(listType); 
foreach (var o in obj) 
{ 
    listType.GetMethod("Add").Invoke(data, new []{o}); 
}