获取类字段列表[重复]
Posted
技术标签:
【中文标题】获取类字段列表[重复]【英文标题】:Getting list of class fields [duplicate] 【发布时间】:2017-01-08 08:54:33 【问题描述】:我正在尝试为我的搜索创建一个通用方法,但我不知道如何从我的类中返回字段列表。
假设我有一门课:
public class Table
[Key]
public int ID get; set;
public string Name get; set;
public string Address get; set;
现在我想返回一个如下所示的列表:
"ID"
"Name"
"Address"
我该怎么做?
试过这样的:
FieldInfo[] fields = typeof(T).GetFields(
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
string[] names = Array.ConvertAll<FieldInfo, string>(fields,
delegate(FieldInfo field) return field.Name; );
但是字段名后面有一些不必要的文字
编辑
这不是重复的,因为在我的情况下 GetProperties().Select(f => f.Name) 有所作为
【问题讨论】:
您在搜索时要查找的术语是“反射”。最容易试验的是typeof(Table).GetProperties()
,它返回PropertyInfo
对象的集合。
特别是,您正在寻找类的属性。 (支持这些属性的字段将具有编译器生成的名称...)
【参考方案1】:
你可以通过反射来做到这一点:
var listOfFieldNames = typeof(Table).GetProperties().Select(f => f.Name).ToList();
请注意,您显然需要属性,而不是字段。术语“字段”是指私有(实例)成员。公共 getter/setter 称为属性。
【讨论】:
完美解决我的问题。谢谢【参考方案2】:您可以编写一个实用函数来获取给定类中的属性名称:
static string[] GetPropertyNames<T>() =>
typeof(T)
.GetProperties()
.Select(prop => prop.Name)
.ToArray();
或者,您可以在 Type 类上提供扩展方法,然后为类型本身配备该功能:
static class TypeExtensions
public static string[] GetPropertyNames(this Type type) =>
type
.GetProperties()
.Select(prop => prop.Name)
.ToArray();
...
foreach (string prop in typeof(Table).GetPropertyNames())
Console.WriteLine(prop);
此代码打印 Table 类型的三个属性名称:
ID
Name
Address
【讨论】:
【参考方案3】:您希望使用所谓的反射。您可以通过以下方式获取PropertyInfo
对象的数组:
PropertyInfo[] properties = typeof(Table).GetType().GetProperties();
PropertyInfo 类包含有关该类中每个属性的信息,包括它们的名称(这是您感兴趣的内容)。反射可以做很多很多其他的事情,但这绝对是最常见的事情之一。
编辑:将我的答案更改为不需要Table
的实例。
【讨论】:
这里,每个属性(如在 foreach(PropertyInfo propertyin properties) 中)将包括名称、类型、getvalue() 之类的东西——你可以用来制作 CSV、XML、DataTables、SQL 的各种东西插入,演员班 - 随便。这是一个信息宝库! 请注意Table.GetType()
不会编译。 GetType()
是一个对象的非静态实例方法。要获取类型的 Type
实例,请使用 typeof()
是的,错过了。它是 typeof(Table)以上是关于获取类字段列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章