2013-09-13 2 views
2

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

class Data 
{ 
    public int ID { get; set; } 
    public List<double> Values { get; set; } 
} 

static void Main(string[] args) 
{ 
    Data d = new Data() { ID = 69, Values = new List<double>() }; 
    d.Values.Add(1.0); 
    d.Values.Add(2.0); 

    PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(Data)); 
    var propInfo = typeof(Data).GetProperties(); 

    foreach (var p in propInfo) 
    { 
     var Value = p.GetValue(d, null); 
     var Type = p.PropertyType; 

     if (Type.IsGenericType && Type.GetGenericTypeDefinition() == typeof(List<>)) 
     { 
      // get the element type of a list 
      var ElementType = Value.GetType().GetProperty("Item").PropertyType; 

      // how to cast to List< "ElementType" > ??? 
     } 
     else 
     { 
      types.Add(Type.FullName); 
     } 
    } 
} 
+2

Что вы собираетесь делать с этим? –

+0

Кажется немного бессмысленным приведение к типу List, который вы приобретаете динамически - поскольку ваш код (статический) не может использовать эту дополнительную информацию о типе. Если вы хотите получить доступ к данным в виде списка, я бы предложил листинг в System.Collections.IList. –

ответ

4

Дженерики и отражения не играют очень красиво. Лучше всего использовать необщего IList API:

IList list = (IList)Value; 

Затем вы можете перебирать, доступ по индексу, добавить, удалить и т.д.

+0

Мне просто нужен счет, но когда я стараюсь, я получаю ошибку компилятора, говоря, что для IList требуется аргумент типа 1. Я использую .Net 4. Нужно ли добавлять другое пространство имен? – chhenning

+2

@chhenning Да, 'System.Collections' – Servy

+0

Спасибо !!! Сейчас все работает. – chhenning

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