C# Reflection 为什么 GetFields 列出我尚未创建的字段如何排除他们

swift

1个回答

写回答

joyeeX

2025-07-09 16:06

+ 关注

AI
AI

使用C#的反射机制可以动态地获取和操作类的成员,包括字段、属性、方法等。其中,GetFields方法可以获取指定类型的所有公共字段,包括父类中的字段。然而,有时候我们可能会发现GetFields方法会列出尚未创建的字段,这是因为GetFields方法会返回所有公共字段,而不仅仅是当前类中的字段。那么,如何排除这些尚未创建的字段呢?

首先,我们需要了解一下GetFields方法的使用方式。GetFields方法是Type类的一个成员方法,需要通过Type对象来调用。它返回一个FieldInfo类型的数组,可以通过遍历数组来获取每个字段的信息。下面是一个简单的示例代码:

csharp

using System;

using System.Reflection;

public class MyClass

{

public int myField1;

public string myField2;

}

public class Program

{

public static void MAIn()

{

Type type = typeof(MyClass);

FieldInfo[] fields = type.GetFields();

foreach (FieldInfo field in fields)

{

Console.WriteLine(field.Name);

}

}

}

在上面的示例代码中,我们定义了一个名为MyClass的类,并在该类中定义了两个公共字段myField1和myField2。然后,我们使用反射机制获取MyClass的类型对象,然后通过调用GetFields方法获取所有公共字段的信息,并通过遍历数组输出字段的名称。

然而,当我们运行上面的代码时,可能会发现输出的字段名称中还包含了一些我们尚未创建的字段。这是因为GetFields方法会返回当前类及其父类中的所有公共字段。

如何排除尚未创建的字段?

为了排除尚未创建的字段,我们可以通过设置BindingFlags参数来指定获取字段的方式。BindingFlags是一个枚举类型,可以用来指定要获取的成员的访问级别、绑定标志和调用方式等。我们可以使用BindingFlags.DeclaredOnly标志来限定只获取当前类中定义的字段,而不包括父类中的字段。下面是修改后的示例代码:

csharp

using System;

using System.Reflection;

public class MyClass

{

public int myField1;

public string myField2;

}

public class Program

{

public static void MAIn()

{

Type type = typeof(MyClass);

FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);

foreach (FieldInfo field in fields)

{

Console.WriteLine(field.Name);

}

}

}

在上面的示例代码中,我们在调用GetFields方法时传入了BindingFlags.DeclaredOnly标志,这样就只会获取当前类中定义的公共字段。然后,通过遍历数组输出字段的名称,可以发现只有myField1和myField2两个字段被输出了。

通过C#的反射机制,我们可以方便地获取和操作类的成员。使用GetFields方法可以获取指定类型的所有公共字段,包括父类中的字段。如果希望排除尚未创建的字段,可以使用BindingFlags.DeclaredOnly标志来限定只获取当前类中定义的字段。这样,我们就可以根据自己的需求来获取所需的字段信息了。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号