我有一个C#方法,我需要传递各种列表。列表的类型会经常不同。方法本身位于不同的dll中,无法知道列表中包含的类对象(没有引用,没有使用语句)。该方法需要读取列表中每个项目的每个成员,并构建并返回基于该项目的字符串。
我的问题是如何在编译时/运行时获取这些各种对象的元数据?反思会这样做吗?
此外,一旦我获得元数据,我如何使用它来实际使用变量?
谢谢
编辑:目前我正在使用它,如下所示:
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());
现在这是非常具体的。我想用泛型替换它,所以我可以传递“User”以外的项目
答案 0 :(得分:5)
如果进入方法的参数(将其称为list
用于讨论)是List<T>
,那么您可以执行以下操作:
Type type = list.GetType().GetGenericArguments()[0];
如果您只有一个通用的T
课程,那么您可以随时使用:
Type typeParameterType = typeof(T);
答案 1 :(得分:3)
.GetType()
会为您提供Type
,您可以获得有关该类型的大量说明。
您还可以使用反射
发现您拥有的实例的成员请准确说明你想要的更多内容?
编辑:这是一种方法,尝试使它成为一种扩展方法,它会更好
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;
}
答案 2 :(得分:1)
是的,您可以使用反射在运行时获取对象的类型。
对object.GetType()
的简单调用将为您提供此实例的类型。
您对此信息的处理取决于您。
答案 3 :(得分: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();
});
答案 4 :(得分:0)
如果您将它们全部视为对象,则可能会使用内置的ToString()
方法进行字符串构建。