gpt4 book ai didi

c# - 不使用 BindingFlag.Default 从 GetType().GetFields 获取字段

转载 作者:IT王子 更新时间:2023-10-29 04:23:14 24 4
gpt4 key购买 nike

我正在使用反射类来获取某个对象内的所有字段。然而,我的问题是,当字段位于普通类中时,它可以完美地工作,例如:

class test
{
string test1 = string.Empty;
string test2 = string.Empty;
}

这里我得到了 test1 和 test2,我的问题是我使用了抽象,因此合并了几个类。

我有这样的东西:

class test3 : test2
{
string test4 = string.Empty;
string test5 = string.Empty;
}

class test2 : test1
{
string test2 = string.Empty;
string test3 = string.Empty;
}
class test1
{
string test0 = string.Empty;
string test1 = string.Empty;
}

但是当我运行它时,我没有从 GetType().GetFields(BindingFlag.Default) 中获取字段。

每个字段都有一个属性,get;设置; 附加到它。当我运行代码时,我一直将属性返回到 test1,但不是实际字段。

这是我试图获取字段的代码:

FieldInfo[] fields = Obj.GetType().GetFields(BindingFlags.Default);
foreach (FieldInfo field in fields)

我也试过:

FieldInfo[] fields = Obj.GetType().GetFields(BindingFlags.Public 
| BindingFlags.Instance
| BindingFlags.NonPublic
| BindingFlags.Static);

我对属性使用相同的代码:

PropertyInfo[] properties = Obj.GetType().GetProperties(BindingFlags.Public 
| BindingFlags.Instance
| BindingFlags.NonPublic
| BindingFlags.Static);

foreach (PropertyInfo property in properties)

知道为什么我从抽象类中获取属性而不是字段吗?

最佳答案

编辑:要获取基类型的私有(private)成员,您必须:

typeof(T).BaseType.GetFields(...)

再次编辑:赢。

编辑 3/22/13:使用 Concat 而不是 Union。由于我们正在指定 BindingFlags.DeclaredOnly 并且类型的 BaseType 不能等于自身,因此不需要 Union 并且更昂贵。

public static IEnumerable<FieldInfo> GetAllFields(Type t)
{
if (t == null)
return Enumerable.Empty<FieldInfo>();

BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Static | BindingFlags.Instance |
BindingFlags.DeclaredOnly;
return t.GetFields(flags).Concat(GetAllFields(t.BaseType));
}

关于c# - 不使用 BindingFlag.Default 从 GetType().GetFields 获取字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1155529/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com