2016-03-29 3 views
3

Я заметил, что я как бы делаю то же самое снова и снова и хотел создать более общий метод преобразования строк из данных в определенный класс.Как создать список неизвестных/типичных типов в C#?

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

Я создал этот класс:

public class Class1 
{ 
    public Guid? Id{ get; set; } 
    public string Text1{ get; set; } 
    public string Text2{ get; set; } 
    public int TheNumber{ get; set; } 
} 

Затем я выборки данных из базы данных, которая представляет Class1. Я возвращаю результат в виде DataTable. Имена в столбцах datarows точно такие же, как в моем классе, поэтому я, хотя я мог бы каким-то образом использовать их в своем общем методе для создания экземпляров Class1.

На данный момент я создаю экземпляр так:

public static Class1 AssembleClass1(DataTable dtInfo) 
    { 
     Class1 obj = null; 

     if (dtInfo != null) 
     { 
      DataRow dr = dtInfo.Rows[0]; 
      obj = new StrategicObjectives(); 
      obj.Id= (Guid)dr["Id"]; 
      obj.Text1 = dr["Id"].ToString(); 
      obj.Text2 = dr["Id"].ToString(); 
      obj.TheNumber = (int)dr["TheNumber"]; 
     } 

     return obj; 
    } 

Теперь, что я хочу сделать, это создать универсальный метод, который принимает DataTable и тип Class1 (так как у меня много другие классы в моем проекте я хочу иметь возможность сделать то же самое). Затем он должен создать список типов Class1 и выполнить итерацию параметров Class1, найти соответствующую таблицу данных в строке (-ах) данных и присвоить правильное значение datarow правильному параметру Class1. Я думаю, что также нужно проверить тип каждого параметра Class1, чтобы правильно преобразовать тип столбца datarow.

я получил только это далеко сам, но я не знаю, если это правильно, и я не знаю, как дальше ..:

public static List<T> AssembleItem<T>(DataTable dtItems) 
    { 
     List<T> items = null; 

     if (dtItems != null) 
     { 
      items = new List<T>(); 

      foreach (DataRow dr in dtItems.Rows) 
      { 
       object item = (T)Activator.CreateInstance(typeof(T)); 
      } 
     } 

     return items; 
    } 

Я надеюсь, что кто-то может помочь мне с этим, пожалуйста, спросите меня если вам нужна дополнительная информация.

+0

Сначала Вы должны узнать о динамическом ключевого слова, непосредственно излучающих код и CasleProject:..) –

+1

'obj.Text1 = др [ "Id"] ToString();' вы имели в виду 'DR [ "Text1"] ToString() '(' dr ["Text2"] 'соответственно)? – HimBromBeere

+1

Почему бы не использовать простой сопоставитель orm как Dapper - https://github.com/StackExchange/dapper-dot-net – Captain0

ответ

1

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

public static List<T> AssembleItem<T>(DataTable dtItems) where T : new() 
{ 
    List<T> items = null; 
    if (dtItems != null) 
    { 
     items = new List<T>(); 
     foreach (DataRow dr in dtItems.Rows) 
     { 
      T item = new T(); 
      foreach (DataRow dr in dtItems.Rows) 
      { 
       T item = new T(); 

       Type t = typeof (T); 
       foreach (var property in t.GetProperties(BindingFlags.Public)) 
       { 
        var propertyname = property.Name; 

        //var data = ...get data from row in database with same column name as propertyname 

        property.SetValue(item,data); 
       } 
       // populate item from dr 
       items.Add(item); 
      } 
     } 
     return items; 
    } 
} 
+0

Спасибо, это привело меня в правильном направлении! –

2

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

public static List<T> AssembleItem<T>(DataTable dtItems) where T : new() 
{ 
    List<T> items = null; 
    if (dtItems != null) 
    { 
     items = new List<T>(); 
     foreach (DataRow dr in dtItems.Rows) 
     { 
      T item = new T(); 
      // populate item from dr 
      items.Add(item); 
     } 
    } 
    return items; 
} 
Смежные вопросы