10

以下のような 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 は、Internal プロパティと Private プロパティを返します。BindingFlagsには、他のアクセシビリティ タイプのフラグはないようです。

内部のプロパティのみのリスト/配列を取得するにはどうすればよいですか? 関連するメモですが、私のアプリケーションには必要ありませんが、保護された、または保護された内部はどうですか?

4

3 に答える 3

16

でプロパティ情報を取得すると、それぞれとBindingFlags.NonPublicを使用してゲッターまたはセッターを見つけます。次に、(メソッド情報の) 次のプロパティをチェックして、正確なアクセス レベルを取得できます。GetGetMethod(true)GetSetMethod(true)

  • propertyInfo.GetGetMethod(true).IsPrivateプライベートを意味します
  • propertyInfo.GetGetMethod(true).IsFamily保護されていることを意味します
  • propertyInfo.GetGetMethod(true).IsAssembly内部を意味します
  • propertyInfo.GetGetMethod(true).IsFamilyOrAssembly保護された内部を意味します
  • propertyInfo.GetGetMethod(true).IsFamilyAndAssembly私的保護を意味する

もちろん同様にGetSetMethod(true)

アクセサー (ゲッターまたはセッター) の 1 つを他のアクセサーよりも制限することは合法であることに注意してください。アクセサーが 1 つしかない場合、そのアクセシビリティはプロパティ全体のアクセシビリティになります。両方のアクセサーが存在する場合、最もアクセスしやすいアクセサーがプロパティ全体のアクセシビリティを提供します。

を使用propertyInfo.CanReadして、呼び出しが可能かどうかを確認しpropertyInfo.GetGetMethod、 を使用propertyInfo.CanWriteして、呼び出しが可能かどうかを確認しますpropertyInfo.GetSetMethodGetGetMethodandGetSetMethodメソッドnullは、アクセサーが存在しない場合 (またはそれが非パブリックであり、パブリック アクセサーを要求した場合)を返します。

于 2013-04-15T20:36:29.397 に答える
3

GetPropertieswith System.Reflection.BindingFlags.NonPublicflag はprivate、 、internalprotectedおよびのすべてを返しますprotected internal

于 2013-04-15T20:27:05.153 に答える