我需要一个列表来存储所有字段 - 类中的值
该类只是我粘贴在下面的一些公共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'。
答案 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");
返回所需信息: