使用system.reflection列出类字段

时间:2012-12-12 02:33:55

标签: c# .net reflection

我需要一个列表来存储所有字段 - 类中的值

该类只是我粘贴在下面的一些公共const string变量。

public class HTDB_Cols
{
    public class TblCustomers
    {
        public const string CustID  = "custID",
               Name  = "name",
         CustType  = "custType",
         AddDate  = "addDate",
         Address  = "address",
         City  = "city",
         Phone  = "phone",
         Cell  = "cell";
    }
}

这是一个方法,它返回一个字符串列表,使我能够拥有一个表示我所有表列名称的字符串列表,尽管由于我收到错误,somthing无法使用此代码

非静态字段需要目标”。

public class GetClassFields
{

        public static List<string> AsList(string TableName)
        {


                    return typeof(HTDB_Cols).GetNestedTypes()
                    .First(t => String.Compare(t.Name, TableName, true) == 0)
                    .GetFields()
                    .Select(f => f.GetValue(null) as string)
                    .ToList();

        }
}

尝试按如下方式使用它:

foreach (string tblCol in RobCS_212a.Utils.Reflct.GetClassFields.AsList      (DBSchema.HTDB_Tables.TblCustomers))
{
    Response.Write(string.Concat(tblCol, "<br />"));
}

在'DBSchema.HTDB_Cols + TblTimeCPAReport'类型上定义的字段'tbName'不是目标对象上的字段,类型为'DBSchema.HTDB_Cols'。

1 个答案:

答案 0 :(得分:1)

你的代码很接近。有两个问题,都位于你的linq select方法调用的参数中:

  • 您的类HTDB_Cols是一个非静态类,您尝试检索的字符串值是实例成员。因此,当您尝试将实例成员从类中拉出时,您必须将该类的实例传递给FieldInof.GetValue方法。在下面的代码中,我在变量“instanceOfClass”中创建了一个类的实例。您可以在FieldInfo class

  • 的文档中看到这一点
  • FieldInfo.GetValue返回的值是一个对象。您必须使用ToString方法或(字符串)强制转换将其显式地转换为字符串。

通过这两项更改,您的方法可行。列表如下:

public class GetClassFields
{
    public static List<string> AsList(string tbl)
    {
        var instanceOfClass = new HTDB_Cols();
        return typeof(HTDB_Cols).GetNestedTypes()
                                .First(t => String.Compare(t.Name, tbl, true) == 0)
                                .GetFields()
                                .Select(f => f.GetValue(instanceOfClass).ToString())
                                .ToList<String>();
    }
}

您可以按如下方式调用此函数:

var fields = GetClassFields.AsList("TblCustomers");

返回所需信息:

enter image description here