BindingFlags - 获取所有这些(最多成员)

时间:2018-04-19 12:13:58

标签: c# reflection

我尝试获取所有类型的BindingFlags(以获取所有属性):

BindingFlags ALL_BF =    BindingFlags.CreateInstance | BindingFlags.DeclaredOnly | BindingFlags.ExactBinding |  BindingFlags.FlattenHierarchy |  BindingFlags.GetField |  BindingFlags.GetProperty |  BindingFlags.IgnoreCase |  BindingFlags.IgnoreReturn |  BindingFlags.Instance | BindingFlags.InvokeMethod |  BindingFlags.NonPublic |  BindingFlags.OptionalParamBinding |  BindingFlags.Public |  BindingFlags.PutDispProperty |  BindingFlags.PutRefDispProperty | BindingFlags.SetField |  BindingFlags.SetProperty | BindingFlags.Static | BindingFlags.SuppressChangeType ;

然而,这会返回空集合:

obj.GetType().GetProperties( ALL_BF ); 

当我尝试时:

obj.GetType().GetProperties( BindingFlags.Public );

返回了许多成员。

1有人可以解释为什么第一种方法没有返回结果吗?哪一个干扰了另一个?

2)我应该使用哪种组合来获得所有(可获得的)成员?

4 个答案:

答案 0 :(得分:2)

组合 BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic中使用的GetProperties(...)就足够了。 您可能希望根据用例添加BindingFlags.DeclaredOnly

(为了快速调试,我使用((BindingFlags)62)来创建上述组合。)

答案 1 :(得分:1)

Tl; dr:

obj.GetType().GetProperties((BindingFlags)(-1)); //You need this (-1 can be int variable ofc)
obj.GetType().GetProperties(); //Not this

说明:

它是绑定标志,因此您不需要没有! (或者也许您想绑定,是吧?)我想您想到了:

obj.GetType().GetProperties(); //Simple way described in MSDN (feels like the downvoting reason)

但是!无参数版本仅返回 public 成员(不合逻辑)。然后,假设您仍然需要传递绑定标志(在变量等中),则可能需要:

obj.GetType().GetProperties((BindingFlags)0); //but it's like passing BindingFlags.Default

错误!不太明显,但是0表示“无”(即BindingFlags.Default),而不是零。

这是正确的方法:

obj.GetType().GetProperties((BindingFlags)(-1)); //Nani?

就不那么明显了。因此-1暗中是“一切”。只是通过调整... 咳嗽 ...在Unity中找到... 咳嗽

P.S .:如果这些拒绝投票者如此聪明,为什么没有真正的答案? 思考

P.P.S:

obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)

种类也一样,

答案 2 :(得分:1)

我不确定“最大会员数”是什么意思

我最近需要获取一种类型的所有成员,即:

  • 字段-公共/私有/静态/继承
  • 属性-公共/私有/静态/继承的属性,上面没有包含后备字段

这是一个解决方案(我们需要求助于类型层次结构,因为GetMembers不会返回基本私有字段):

static IEnumerable<MemberInfo> GetMembers(Type type, bool getStatic=true, bool getPrivate=true, bool getBases=true) {
    var memberList = ImmutableList<MemberInfo>.Empty;
    if (type is null || type == typeof(Object)) return memberList;

    var bindingFlags = BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public;
    if (getStatic) bindingFlags |= BindingFlags.Static;
    if (getPrivate) bindingFlags |= BindingFlags.NonPublic;

    memberList = memberList.AddRange(type.GetMembers(bindingFlags));
    if (getBases) memberList = memberList.AddRange(GetMembers(type.BaseType, getStatic, getPrivate, getBases));
    return memberList.Where(memberInfo => memberInfo is PropertyInfo || (memberInfo is FieldInfo && memberInfo.GetCustomAttribute<CompilerGeneratedAttribute>() == null)); // filter out property with backing fields
}

希望这会有所帮助

答案 3 :(得分:0)

也许你应该尝试:

obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)

看到这个问题: How to get the list of properties of a class?