Как создать список динамически из имени класса (который передается в качестве аргумента) и вернуть список в c # .net - PullRequest
0 голосов
/ 29 декабря 2011

Как создать список динамически из имени класса (которое передается в качестве аргумента) и вернуть список в C #.

Код ниже может не работать. Я отправил это, чтобы дать идею:

 public T ConvertDataSetToList<T>(DataSet _ds, String tableName, string className)
    {
        Type classType=Type.GetType(className);
        List<T> newList = new List<T>();

        //System.Activator.CreateInstance(Type.GetType(className));

        try
        {
            Details _Details;
            for (int iRowCount = 0; iRowCount < _ds.Tables[tableName].Rows.Count; iRowCount++)
            {
                _Details = FillDTO(_ds.Tables[tableName].Rows[iRowCount]);
                newList.Add(_msDetails);
            }
        }
        catch (Exception ex) { }
        return newList;
    }

1 Ответ

0 голосов
/ 30 декабря 2011

Вы можете расставить точки над некоторыми базовыми элементами отображения.

//Maps a dataset
public List<T> MapDataSet<T>(DataSet anyDataset
                           , string tablename) where T : new()
{
  return MapDataTable<T>(anyDataset.Tables[tablename]);
}

// Maps a datatable
public List<T> MapDataTable<T>(DataTable table) where T : new()
{
  List<T> result = new List<T>();
  foreach(DataRow row in table.Rows)
  {
     result.Add(MapDataRow<T>(row));
  }
  return result;
}

// maps a DataRow to an arbitrary class (rudimentary)
public T MapDataRow<T>(DataRow row) where T: new()
{
  // we map columns to class properties
  Type destinationType = typeof(T);
  // create our new class
  T mappedTo = new T();
  // iterate over the columns
  for(int columnIndex=0;columnIndex<row.ItemArray.Length;columnIndex++)
  {
    // get a matching property of our class
    PropertyInfo fieldTo = destinationType.GetProperty(
                              row.Table.Columns[columnIndex].ColumnName );
    if (fieldTo !=null)
    {
       // map our fieldvalue to our property
       fieldTo.SetValue(mappedTo, row[columnIndex], new object[] {});
    }
    else
    {
     // sorry, field doens't match any property on class
    }
  }
  return mappedTo;
}

Вот базовое тестовое приложение, демонстрирующее его использование

void Main()
{
    DataTable dt = new DataTable("hello");
    dt.Columns.Add("foo");
    dt.Columns.Add("bar");
    dt.Columns.Add("foobar");

    DataRow row = dt.NewRow();
    row[0]="blah1";
    row[1] ="two";
     row[2] = "fb1";

    dt.Rows.Add(row);

    row = dt.NewRow();
    row[0]="apples";
    row[1] ="pears";
    row[2] = "duh";

    dt.Rows.Add(row);

    List<DTO> list = MapDataTable<DTO>(dt);
    List<SecondDTO> list2 = MapDataTable<SecondDTO>(dt);

}

// sample DTO object
public class DTO
{
  public string foo { get; set;}
  public string bar { get; set; }
}

// another sample DTO object
public class SecondDTO
{
  public string foo { get; set;}
  public string foobar { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...