没有从GetType()获取字段.使用BindingFlag.Default获取GetFields

Pat*_*ick 25 c# reflection bindingflags

我正在使用Reflection类来获取某个对象中的所有字段.然而,我的问题是,当字段在普通类中时,它可以正常工作,例如:

class test
{
   string test1 = string.Empty;
   string test2 = string.Empty;
}
Run Code Online (Sandbox Code Playgroud)

在这里我得到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;
}
Run Code Online (Sandbox Code Playgroud)

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

这些领域的每个人都有get; set;附属于它的财产.当我运行代码时,我将属性一直返回到test1但不是实际的字段.

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

FieldInfo[] fields = Obj.GetType().GetFields(BindingFlags.Default);
foreach (FieldInfo field in fields)
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

FieldInfo[] fields = Obj.GetType().GetFields(BindingFlags.Public 
                                             | BindingFlags.Instance 
                                             | BindingFlags.NonPublic 
                                             | BindingFlags.Static);
Run Code Online (Sandbox Code Playgroud)

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

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

foreach (PropertyInfo property in properties)
Run Code Online (Sandbox Code Playgroud)

任何想法为什么我从抽象类而不是字段中获取属性?

Sam*_*ell 49

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

typeof(T).BaseType.GetFields(...)
Run Code Online (Sandbox Code Playgroud)

再次编辑:赢.

编辑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));
}
Run Code Online (Sandbox Code Playgroud)