如何查找C#类的内部属性?保护?保护内部?

时间:2013-04-15 20:17:08

标签: c# system.reflection

如果我有一个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上的其他辅助功能类型似乎没有标记。

如何获取仅包含内部属性的列表/数组?在相关的说明中,但对我的应用程序来说不是必需的,那么受保护或受保护的内部呢?

3 个答案:

答案 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。如果访问者不存在(或者如果它是非公开的并且您要求提供公共访问者),GetGetMethodGetSetMethod方法将返回null

答案 1 :(得分:6)

请参阅MSDN上的this article

相关引用:

  

C#关键字受保护且内部在IL中没有意义   没有在反射API中使用。 IL中的相应术语是   家庭和集会。要使用反射识别内部方法,   使用IsAssembly属性。要识别受保护的内部方法,   使用IsFamilyOrAssembly。

答案 2 :(得分:3)

带有GetProperties标志的

System.Reflection.BindingFlags.NonPublic会返回所有标记:privateinternalprotectedprotected internal