10

如果我有一个MyClass如下的 C# 类:

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 返回 Internal 和 Private 属性。BindingFlags上似乎没有其他可访问性类型的标志。

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

4

3 回答 3

16

当您使用 获取属性信息时,您可以分别BindingFlags.NonPublic使用GetGetMethod(true)和找到 getter 或 setter。GetSetMethod(true)然后,您可以检查(方法信息的)以下属性以获取确切的访问级别:

  • propertyInfo.GetGetMethod(true).IsPrivate意味着私人的
  • propertyInfo.GetGetMethod(true).IsFamily表示受保护
  • propertyInfo.GetGetMethod(true).IsAssembly意味着内部
  • propertyInfo.GetGetMethod(true).IsFamilyOrAssembly意味着受保护的内部
  • propertyInfo.GetGetMethod(true).IsFamilyAndAssembly意味着私人保护

当然,同样GetSetMethod(true)如此。

请记住,让其中一个访问器(getter 或 setter)比另一个更受限制是合法的。如果只有一个访问器,它的可访问性就是整个属性的可访问性。如果两个访问器都在那里,那么容易访问的访问器会为您提供整个属性的可访问性。

用于propertyInfo.CanRead查看是否可以调用propertyInfo.GetGetMethod,使用propertyInfo.CanWrite用于查看是否可以调用propertyInfo.GetSetMethod。如果访问器不存在(或者如果它是非公共的并且您要求公共访问器),则andGetGetMethod方法GetSetMethod返回。null

于 2013-04-15T20:36:29.397 回答
6

请参阅MSDN 上的这篇文章

相关报价:

C# 关键字 protected 和 internal 在 IL 中没有任何意义,也不会在反射 API 中使用。IL 中对应的术语是 Family 和 Assembly。要使用反射识别内部方法,请使用 IsAssembly 属性。要识别受保护的内部方法,请使用 IsFamilyOrAssembly。

于 2013-04-15T20:28:24.833 回答
3

GetPropertieswith System.Reflection.BindingFlags.NonPublicflag 返回所有这些:private, internal,protectedprotected internal.

于 2013-04-15T20:27:05.153 回答