通过 .net 反射仅获取受保护的成员
Get only protected members via .net reflection
此returns所有非public实例属性:
var instanceNonPublic = currentType.GetProperties (BindingFlags.Instance |
BindingFlags.NonPublic);
但是有什么方法可以确定哪个访问修饰符适用于每个 属性? private
、internal
或 protected
?
由于属性由 get
方法和 set
方法组成,您可以迭代它们并使用它们的 get
和 set
过滤相关的 PropertyInfo
s方法的访问修饰符:
var instancePrivate = currentType.GetProperties(BindingFlags.Instance |
BindingFlags.NonPublic)
.Where(x => x.GetMethod.IsPrivate &&
x.SetMethod.IsPrivate);
这些是有趣的访问修饰符:
IsPrivate
表示方法为private
.
IsFamily
表示方法为protected
.
IsAssembly
表示方法为internal
.
其他优雅设置过滤器的方法是使用 FindMembers
:
public void YourMethod()
{
...
var instancePrivate = currentType.FindMembers(MemberTypes.Property,
BindingFlags.Instance |
BindingFlags.NonPublic,
PrivateMemberFilter, null);
.OfType<PropertyInfo>();
...
}
static readonly MemberFilter PrivatePropertyFilter = (objMemberInfo, objSearch) =>
{
PropertyInfo info = (objMemberInfo as PropertyInfo);
if (info == null)
{
return false;
}
return info.GetMethod.IsPrivate && info.SetMethod.IsPrivate;
};
此returns所有非public实例属性:
var instanceNonPublic = currentType.GetProperties (BindingFlags.Instance |
BindingFlags.NonPublic);
但是有什么方法可以确定哪个访问修饰符适用于每个 属性? private
、internal
或 protected
?
由于属性由 get
方法和 set
方法组成,您可以迭代它们并使用它们的 get
和 set
过滤相关的 PropertyInfo
s方法的访问修饰符:
var instancePrivate = currentType.GetProperties(BindingFlags.Instance |
BindingFlags.NonPublic)
.Where(x => x.GetMethod.IsPrivate &&
x.SetMethod.IsPrivate);
这些是有趣的访问修饰符:
IsPrivate
表示方法为private
.IsFamily
表示方法为protected
.IsAssembly
表示方法为internal
.
其他优雅设置过滤器的方法是使用 FindMembers
:
public void YourMethod()
{
...
var instancePrivate = currentType.FindMembers(MemberTypes.Property,
BindingFlags.Instance |
BindingFlags.NonPublic,
PrivateMemberFilter, null);
.OfType<PropertyInfo>();
...
}
static readonly MemberFilter PrivatePropertyFilter = (objMemberInfo, objSearch) =>
{
PropertyInfo info = (objMemberInfo as PropertyInfo);
if (info == null)
{
return false;
}
return info.GetMethod.IsPrivate && info.SetMethod.IsPrivate;
};