如何在c#中迭代内部属性

Gan*_*shT 26 c# reflection properties access-modifiers

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; }
}
Run Code Online (Sandbox Code Playgroud)

我可以使用以下循环遍历属性,但它只显示公共属性.我需要所有的属性.

foreach (PropertyInfo property in typeof(TestClass).GetProperties())
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 57

您需要使用重载接受来指定您不仅需要公共属性BindingFlags:

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

添加BindingFlags.Static如果您要包括静态属性.

无参数重载仅返回公共属性.

  • 给NonPublic和Instance隐藏prop 1和prop 2,你需要两者,NonPublic | 公共所有财产 (7认同)

jas*_*son 10

你需要改变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
}
Run Code Online (Sandbox Code Playgroud)


Fil*_*vić 5

根据MSDN,Reflection API不识别私有和内部。

若要使用反射标识内部方法,请使用IsAssembly属性。若要标识受保护的内部方法,请使用IsFamilyOrAssembly。

如果要编写一些测试单元,则可能需要查看InternalsVisibleTo属性。它允许您指定哪个程序集可以看到内部属性。

最后,您真的需要具有内部属性吗?