如何循环遍历类的字段名称

22

我有一个包含超过150个字段的类。我需要将字段名称(而不是值)放到一个数组中。

因为手动在代码中编写150个字段名称(根据需求的更改可能会增加或减少)非常困难且不是一种好的方法。

我需要帮助来循环获取字段名称或获取字段名称列表并将其放入数组中,以便我可以遍历它并在代码中使用它。 我正在使用Visual Studio 2008

谢谢

5个回答

19

对于所有的公共和非公共实例字段:

var fields = typeof(YourType).GetFields(
    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
var names = Array.ConvertAll(fields, field => field.Name);

或在VS2005中(注释):

FieldInfo[] fields = typeof(YourType).GetFields(
    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
string[] names = Array.ConvertAll<FieldInfo, string>(fields,
    delegate(FieldInfo field) { return field.Name; });

嗨Marc。这是一个非常好的解决方案。请问您能否告诉我,它对于Visual Studio 2005是否相同,还是会有其他的语法? - Dr. Rajesh Rolen
实际上,我在VS2005中得到了一个与先前版本相同的应用程序。 - Dr. Rajesh Rolen
有一个小区别。在vs 2005中,您不能使用ConvertAll,因此应改用foreach。并且使用具体类型而不是var。 - StuffHappens
@Rajesh,@StuffHappens 你们应该可以使用ConvertAll,但语法会更冗长-我会更新。 - Marc Gravell

10

试试这个:

var t = typeof(YourTypeHere);
List<string> fieldNames = new List<string>(t.GetFields().Select(x => x.Name));

3

尝试

    public static string[] GetFieldNames(Type t)
    {
        FieldInfo[] fieldInfos = t.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
        return fieldInfos.Select(x => x.Name).ToArray();
    }

1

对我来说起作用了

var t = typeof(YOURTYPE);

var allfieldNames = new List<string>(t.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Select(x => x.Name));

// t代表类型


1
这对我来说很完美。ExampleClass是一个类,你需要列出所有字段。
public void GetClassFields(Type t)
{
    List<string> fieldNames = new List<string>(t.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Select(x => x.Name));
    foreach (string name in fieldNames)
    {
        Console.WriteLine(name);
    }       
}
//Usage
GetClassFields(typeof(ExampleClass));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接