web-dev-qa-db-ja.com

C#の内部プロパティを反復処理するにはどうすればよいですか?

public class TestClass
{
        public string property1 { get; set; }
        public string property2 { get; set; }

        internal string property3 { get; set; }
        internal string property4 { get; set; }
        internal string property5 { get; set; }
}

次のループでプロパティを反復処理できますが、パブリックプロパティのみが表示されます。すべてのプロパティが必要です。

foreach (PropertyInfo property in typeof(TestClass).GetProperties())
{
    //do something
}
26
GaneshT

overload accepting BindingFlags :を使用して、パブリックプロパティだけが必要ではないことを指定する必要があります。

foreach (PropertyInfo property in typeof(TestClass)
             .GetProperties(BindingFlags.Instance | 
                            BindingFlags.NonPublic |
                            BindingFlags.Public))
{
    //do something
}

追加 BindingFlags.Static静的プロパティを含める場合。

パラメータなしのオーバーロードは、パブリックプロパティのみを返します。

57
Jon Skeet

BindingFlags への呼び出しで Type.GetProperties

試してください:

var instanceProperties = typeof(TestClass).GetProperties(
    BindingFlags.Public |
    BindingFlags.NonPublic | 
    BindingFlags.Instance
);
foreach(var instanceProperty in instanceProperties) {
    // a little something something for the instanceProperty
}
10
jason

[〜#〜] msdn [〜#〜] によると、プライベートと内部はReflectionAPIで認識されません。

Reflectionを使用して内部メソッドを識別するには、IsAssemblyプロパティを使用します。保護された内部メソッドを識別するには、IsFamilyOrAssemblyを使用します。

いくつかのテストユニットを作成している場合は、 InternalsVisibleTo 属性を確認することをお勧めします。これにより、どのアセンブリが内部プロパティを表示できるかを指定できます。

そして最後に、あなたは本当に内部プロパティを持っている必要がありますか...

5
Filip Popović

使用 BindingFlags

foreach (PropertyInfo property in typeof(TestClass)
        .GetProperties(
            BindingFlags.Public |
            BindingFlags.NonPublic |
            BindingFlags.Instance))
{
    //do something
}
3
amit_g

getPropertiesでどのバインディングフラグを指定するかによって:

foreach (PropertyInfo property in typeof(TestClass).GetProperties(
      BindingFlags.Instance|
      BindingFlags.Public|
      BindingFlags.NonPublic))
3
MatteKarla

NonPublicプロパティをクエリし、「IsAssembly」でこれらのGetメソッドをフィルタリングすることで、型の内部プロパティを取得します。

「internalprotected」プロパティのゲッターは「IsFamilyOrAssembly」、「protected」プロパティは「IsFamily」、「private」プロパティは「IsPrivate」とマークされています。

    public class TestClass
    {
        public string Property1 { get; set; }
        private string Property2 { get; set; }

        public string Property9 { get; set; }
        private string Property10 { get; set; }

        protected internal string Property3 { get; set; }
        protected string Property4 { get; set; }
        internal string Property5 { get; set; }

        protected internal int Property6 { get; set; }
        protected int Property7 { get; set; }
        internal int Property8 { get; set; }

        internal static void ShowPropertyAccessScope(Type t)
        {

            foreach (var prop in t.GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                Console.WriteLine("{0,-28} {1,15}", "Public property:", prop.Name);
            }

            var nonPublic = t.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic);

            foreach (var prop in nonPublic.Where(p => p.GetGetMethod(true)?.IsAssembly == true))
            {
                Console.WriteLine("{0,-28} {1,15}", "Internal property:", prop.Name);
            }

            foreach (var prop in nonPublic.Where(p => p.GetGetMethod(true)?.IsFamilyOrAssembly == true))
            {
                Console.WriteLine("{0,-28} {1,15}", "Internal protected property:", prop.Name);
            }

            foreach (var prop in nonPublic.Where(p => p.GetGetMethod(true)?.IsFamily == true))
            {
                Console.WriteLine("{0,-28} {1,15}", "Protected property:", prop.Name);
            }

            foreach (var prop in nonPublic.Where(p => p.GetGetMethod(true)?.IsPrivate == true))
            {
                Console.WriteLine("{0,-28} {1,15}", "Private property:", prop.Name);
            }
        }
        static void Main() 
        {
            ShowPropertyAccessScope(typeof(TestClass));
        }
    }
0
lidqy