2015-01-26 2 views
1

У меня есть эта функция: переменная c получает все свойства моего класса <T> в этом случае: c ->
Id
Key
Valueустановленного значения для общего типа <T>

public List<T> ReadStoreProceadure<T>(string storeName) 
{ 
    var result = new List<T>(); 
    var instance = (T) Activator.CreateInstance(typeof (T), new object[] {}); 
    var c = typeof (T); 
    var data = DataReader.ReadStoredProceadures(_factibilidad, storeName); // This part is returning verified data and it's ok 

    while (data.Read()) 
       if (data.HasRows) 
       { 
        foreach (var item in c.GetProperties()) 
        { 
         //item.SetValue(c, item.Name, null); 
        } 
       }  
} 

Как я могу добавить эти значения в свой экземпляр instance и добавить его в мой result переменная? Возможно?

+1

Я думаю, вам будет лучше сдерживать Т как некоторый интерфейс/абстрактный класс, который имеет эти 3 поля на нем. – pquest

+1

Это может помочь http://www.codeproject.com/Tips/784090/Conversion-Between-DataTable-and-List-in-Csharp –

+0

@pquest Я не уверен, могу ли я построить тип абзаца, потому что у меня есть 'n' количество моделей с разным форматом. Но я могу объединить все эти модели в универсальном 'IEnumerable >' Я думаю – MrMins

ответ

5

Я создал метод расширения для IDataReader, который делает в основном то, что я считаю, что вы пытаетесь сделать:

 public static List<T> ToList<T>(this IDataReader dr) where T: new() 
    { 
     var col = new List<T>(); 
     var type = typeof(T); 
     var props = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); 

     while (dr.Read()) 
     { 
      var obj = new T(); 
      for (int i = 0; i < dr.FieldCount; i++) 
      { 
       string fieldName = dr.GetName(i); 
       var prop = props.FirstOrDefault(x => x.Name.ToLower() == fieldName.ToLower()); 
       if (prop != null) 
       { 
        if (dr[i] != DBNull.Value) 
         prop.SetValue(obj, dr[i], null); 
       } 
      } 
      col.Add(obj); 
     } 

     dr.Close(); 
     return col; 
    } 

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

+0

работает отлично, спасибо! – MrMins

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

  • Нет связанных вопросов^_^