如果我有一个C#类MyClass
,如下所示:
using System.Diagnostics;
namespace ConsoleApplication1
{
class MyClass
{
public int pPublic {get;set;}
private int pPrivate {get;set;}
internal int pInternal {get;set;}
}
class Program
{
static void Main(string[] args)
{
Debug.Assert(typeof(MyClass).GetProperties(
System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.Instance).Length == 1);
Debug.Assert(typeof(MyClass).GetProperties(
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance).Length == 2);
// internal?
// protected?
// protected internal?
}
}
}
上面的代码编译是在没有任何断言失败的情况下运行的。 NonPublic返回内部和私有属性。 BindingFlags上的其他辅助功能类型似乎没有标记。
如何获取仅包含内部属性的列表/数组?在相关的说明中,但对我的应用程序来说不是必需的,那么受保护或受保护的内部呢?
答案 0 :(得分:16)
当您使用BindingFlags.NonPublic
获取属性信息时,您可以分别使用GetGetMethod(true)
和GetSetMethod(true)
找到getter或setter。然后,您可以检查以下属性(方法信息)以获得准确的访问级别:
propertyInfo.GetGetMethod(true).IsPrivate
表示私人propertyInfo.GetGetMethod(true).IsFamily
表示受保护propertyInfo.GetGetMethod(true).IsAssembly
表示内部propertyInfo.GetGetMethod(true).IsFamilyOrAssembly
表示受保护的内部,当然也适用于GetSetMethod(true)
。
请记住,让其中一个访问者(getter或setter)比另一个更受限制是合法的。如果只有一个访问者,则其可访问性是整个属性的可访问性。如果两个访问者都在那里,那么 most 可访问的访问者将为您提供整个属性的可访问性。
使用propertyInfo.CanRead
查看是否可以拨打propertyInfo.GetGetMethod
,并使用propertyInfo.CanWrite
查看是否可以拨打propertyInfo.GetSetMethod
。如果访问者不存在(或者如果它是非公开的并且您要求提供公共访问者),GetGetMethod
和GetSetMethod
方法将返回null
。
答案 1 :(得分:6)
请参阅MSDN上的this article。
相关引用:
C#关键字受保护且内部在IL中没有意义 没有在反射API中使用。 IL中的相应术语是 家庭和集会。要使用反射识别内部方法, 使用IsAssembly属性。要识别受保护的内部方法, 使用IsFamilyOrAssembly。
答案 2 :(得分:3)
GetProperties
标志的 System.Reflection.BindingFlags.NonPublic
会返回所有标记:private
,internal
,protected
和protected internal
。