3

我有一个需要将各种列表传递到的 C# 方法。列表的类型经常会有所不同。方法本身在不同的 dll 中,无法知道列表中包含的类对象(没有引用,没有 using 语句)。该方法需要读取列表中每个项目的每个成员,并在此基础上构建并返回一个字符串。

我的问题是如何在编译时/运行时获取这些不同对象的元数据?反射会这样做吗?

另外,一旦我得到元数据,我如何使用它来实际使用变量?

谢谢

编辑:目前我正在使用它,如下所示:

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());

现在这是非常具体的。我想用泛型替换它,这样我就可以传递“用户”以外的项目

4

5 回答 5

5

list如果进入该方法的参数(为了讨论将调用它)是List<T>那么您可以执行以下操作:

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

如果你只有一个泛型T类,那么你总是可以这样做:

Type typeParameterType = typeof(T);
于 2013-07-11T13:40:32.120 回答
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;
}
于 2013-07-11T13:40:58.040 回答
1

是的,您可以在运行时使用反射来获取对象的类型。

简单的调用object.GetType()将为您提供此实例的类型。

您如何处理这些信息取决于您。

于 2013-07-11T13:39:04.550 回答
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();
        });
于 2013-07-11T13:58:48.837 回答
0

如果您将它们全部视为对象,使用ToString()字符串构建的内在方法,这可能会起作用。

于 2013-07-11T13:49:05.267 回答