获取类字段列表[重复]

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)

以上是关于获取类字段列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

获取类的变量列表[重复]

在C#中获取命名空间中的类列表[重复]

使用SQLAlchemy,如何在类中创建一个字段,该类是所述类的其他实例的列表? [重复]

在 Java 中的对象列表中搜索字段 [重复]

从文本字段复制值以选择下拉列表[重复]

C# + Unity - 从类列表中的变量中获取最小值[重复]