2013-07-11 6 views
1

У меня есть метод C#, который мне нужно передать в различные списки. Тип списков будет отличаться очень часто. Сам метод находится в другой dll и не может знать объекты класса, содержащиеся в списках (без ссылок, без использования операторов). Метод должен читать каждый из членов каждого из элементов в списке и строить и возвращать строку, основанную на этом.C# Определить тип общего списка

Мой вопрос в том, как можно получить метаданные для этих различных объектов в compiletime/runtime? Будет ли отражение этого?

Кроме того, как только я получаю метаданные, как я могу использовать его для фактического использования переменных?

Спасибо

EDIT: В настоящее время я использую его, как следующее:

public string GetData(List<User> list){ 
//... 
    List<RowData> rows = new List<RowData>(); 
    foreach (User item in list) 
    { 
     RowData row = new RowData(); 
     row.id = count++; 
     row.cell = new string[3]; 
     row.cell[0] = item.ID.ToString(); 
     row.cell[1] = item.name; 
     row.cell[2] = item.age.ToString(); 

     rows.Add(row); 
    } 
//... 
    return new JavaScriptSerializer().Serialize(rows.ToArray()); 

Сейчас это очень специфический. Я хочу заменить это дженериками, чтобы я мог передавать элементы, отличные от «Пользователь»

+0

Отражение является то, что вы хотите, да. См. Этот ответ для некоторых хороших вводных ссылок: http://stackoverflow.com/questions/9428779/a-good-and-complete-tutorial-about-reflection-in-net –

+0

Возможно, подумайте об использовании 'dynamic', чтобы избежать прыжков через обручи с отражением напрямую. –

+0

Я уточнил вопрос по поводу использования – Mike

ответ

2

.GetType() поможет вам Type, и вы можете получить много описаний о типе.

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

Пожалуйста, если быть точным, что вы хотите более точно?

EDIT: Вот способ, попробуйте сделать это методом extenstion было бы лучше

public static List<RowData> ToDataTable<T>(IEnumerable<T> source) 
{ 
    System.Reflection.PropertyInfo[] properties = typeof(T).GetProperties(); 
    List<RowData> rows = new List<JQGridRow>(); 


    foreach (var item in source) 
    { 
     RowData row = new RowData(); 
     row.cells = new string[properties.Length]; 
     int i=0; 
     foreach (var prop in properties) 
     { 
      row.cells[i] = prop.GetValue(item, null);i++; 
     } 
     rows.Add(row); 
    } 
    return rows; 
} 
+0

У меня есть вопрос с дополнительной информацией. – Mike

+1

Спасибо, это сработало (с небольшими корректировками синтаксиса). – Mike

1

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

Простой вызов object.GetType() даст вам тип этого экземпляра.

Что вы делаете с этой информацией зависит от вас.

4

Если параметр (будем называть его list ради ОБСУЖДЕНИЕ в) вступления в метод является List<T>, то вы можете сделать следующее:

Type type = list.GetType().GetGenericArguments()[0]; 

Если у вас есть только общий T класс, то вы всегда можете просто пойти с этим:

Type typeParameterType = typeof(T); 
+1

Вам нужно быть немного осторожным; Я мог бы создать «класс Foo: List ' и передать «Foo» в этот метод - он будет работать, но вызов 'GetGenericArguments() завершится неудачно –

+0

Good point Marc. –

0

Это может сработать, если рассматривать их все как объекты, с использованием собственного ToString() метода для струнного здания.

1

Возможно, что-то вроде этого?

public string GetData<T>(IEnumerable<T> list, Func<T, RowData> fillRow) 
    { 
     List<RowData> rows = new List<JQGridRow>(); 
     foreach (User item in list) 
     { 
      RowData row = new RowData(); 
      row.id = count++; 

      fillRow(row); 

      rows.Add(row); 
     } 
     //... 
     return new JavaScriptSerializer().Serialize(rows.ToArray()); 
    } 

И использовать его как

 string s = GetData(users, row => 
     { 
      row.cell = new string[3]; 
      row.cell[0] = item.ID.ToString(); 
      row.cell[1] = item.name; 
      row.cell[2] = item.age.ToString(); 
     }); 
Смежные вопросы