我尝试获取所有类型的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)我应该使用哪种组合来获得所有(可获得的)成员?
答案 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)