2015-06-02 4 views
0

Я пытаюсь преобразовать List из System.Object объектов в List объектов строго типизированного типа.Преобразование списка общих объектов в список не общего типа

Здесь ошибка я получаю:

Объект типа «System.Collections.Generic.List`1 [System.Object]» не может быть преобразован в тип «System.Collections.Generic.List `1 [TestApp.Tsc_Mrc_Step]».

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

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

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

  bool isCoollection = false; 
      Type t = GetTypeInsideOfObjectByTypeName(o, tableName, out isCoollection); 

      List<object> objectColl = new List<object>(); 

      object obj = Activator.CreateInstance(t); 
      if (obj != null) 
      { 
       PropertyInfo[] objectProps = obj.GetType().GetProperties(); 
       foreach (PropertyInfo op in objectProps) 
       { 
        if (HasColumn(reader, op.Name)) 
        { 
         op.SetValue(obj, reader[op.Name]); 
        } 
       } 

       if (isCoollection) 
       { 
        objectColl.Add(obj); 
       } 
      } 

      if (isCoollection) 
      { 
       IEnumerable<object> objs = objectColl.AsEnumerable(); 

       SetObject(o, objs); 
      } 
      else 
      { 
       SetObject(o, obj); 
      } 

Вот SetObject:

  public static void SetObject(object parentObject, object newObject) 
      { 
       PropertyInfo[] props = parentObject.GetType().GetProperties(); 
       string typeName = newObject.GetType().Name; 
       foreach (PropertyInfo pi in props) 
       { 
        if (pi.PropertyType.Name.ToLower() == typeName.ToLower()) 
        { 
         pi.SetValue(parentObject, newObject); 
        } 
        else if (!pi.PropertyType.IsValueType && !pi.PropertyType.Namespace.ToLower().Contains("system")) 
        { 
         SetObject(pi.GetValue(parentObject), newObject); 
        } 
       } 
      } 
+2

Можете ли вы опубликовать, что вы попробовали? –

+2

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

+2

Использование reflection _and_ generics вместе означает, что вы не должны использовать _either_. –

ответ

4

Если вы знаете, все значения имеют нужного типа в списке:

List<Object> objects; 
List<Cat> cats = objects.Cast<Cat>().ToList(); 

Если не все значения типа , и вы хотите отсеять тех, которые не являются:

List<Object> objects; 
List<Cat> cats = objects.OfType<Cat>().ToList(); 

Оба требуют LINQ.

Если вы не знаете тип до исполнения, вам нужно использовать отражение.

How to call a generic method through reflection

+0

Но все, что я знаю, это Тип, а не имя класса :( – deccks

+0

@deccks, но ... тип IS - это имя класса –

+0

, но как я могу это сделать: Тип t = GetTypeInsideOfObjectByTypeName (o, tableName, out isCoollection); IEnumerable cats = objects.OfType () .AsEnumerable(); – deccks

0

Хорошо, я достиг своей цели. Все благодаря динамической переменной. Я впечатлен тем, что я могу это сделать с помощью .NET. Как вы думаете? Спасибо :)

Type t = GetTypeInsideOfObjectByTypeName(o, tableName, out isCoollection); 

Type genericListType = typeof(List<>).MakeGenericType(t); 

object coll = Activator.CreateInstance(genericListType); 

dynamic objectColl = Convert.ChangeType(coll, coll.GetType()); 

dynamic d = Convert.ChangeType(obj, obj.GetType()); 

objectColl.Add(d); 
Смежные вопросы