0

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

该类只是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";
    }
}

这是一个返回字符串列表的方法,它使我能够拥有代表我所有表列名称的字符串列表,尽管由于出现错误,因此某些东西无法使用此代码

非静态字段需要一个目标”。

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”类型的目标对象上的字段。

4

1 回答 1

1

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

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

  • 从 FieldInfo.GetValue 返回的值是一个对象。您必须使用 ToString 方法或 (string) cast 将其显式转换为字符串。

通过这两个更改,您的方法有效。清单如下:

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

它返回所需的信息:

在此处输入图像描述

于 2012-12-12T02:52:32.057 回答