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
}
overload accepting BindingFlags
:を使用して、パブリックプロパティだけが必要ではないことを指定する必要があります。
foreach (PropertyInfo property in typeof(TestClass)
.GetProperties(BindingFlags.Instance |
BindingFlags.NonPublic |
BindingFlags.Public))
{
//do something
}
追加 BindingFlags.Static
静的プロパティを含める場合。
パラメータなしのオーバーロードは、パブリックプロパティのみを返します。
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
}
[〜#〜] msdn [〜#〜] によると、プライベートと内部はReflectionAPIで認識されません。
Reflectionを使用して内部メソッドを識別するには、IsAssemblyプロパティを使用します。保護された内部メソッドを識別するには、IsFamilyOrAssemblyを使用します。
いくつかのテストユニットを作成している場合は、 InternalsVisibleTo 属性を確認することをお勧めします。これにより、どのアセンブリが内部プロパティを表示できるかを指定できます。
そして最後に、あなたは本当に内部プロパティを持っている必要がありますか...
使用 BindingFlags
foreach (PropertyInfo property in typeof(TestClass)
.GetProperties(
BindingFlags.Public |
BindingFlags.NonPublic |
BindingFlags.Instance))
{
//do something
}
getPropertiesでどのバインディングフラグを指定するかによって:
foreach (PropertyInfo property in typeof(TestClass).GetProperties(
BindingFlags.Instance|
BindingFlags.Public|
BindingFlags.NonPublic))
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));
}
}