使用反射返回所有对象属性(包括私有)

时间:2018-03-09 14:41:56

标签: c#

我在stackoverflow以及包括MS文档在内的其他网站上查看了这个,并尝试了我遇到的所有可能的答案,但无济于事。不确定,我做错了什么。简单的类,试图获得所有属性,包括私有属性。

该解决方案是vs2017 15.5.7中的控制台应用程序,c#2017,netFramework 4.7.02

尝试了所有绑定标志组合:

 (BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.Static)
 (BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static |
 BindingFlags.Instance | BindingFlags.DeclaredOnly)

包括代码:

var listnew = new List<Test>
{
    new Test {Name = "Test"}
};

foreach (var item in listnew)
{
    var test = item.GetType().GetProperties(BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.Static);

    foreach (var prop in test)
    {
        System.Console.WriteLine(prop);
        System.Console.WriteLine(prop.GetValue(item));
    }
}

这是班级:

public class Test
{
    private string _name;

    public string Name
    { 
        get => _name;
        set => _name = value;
    }
}

2 个答案:

答案 0 :(得分:6)

我想你想要属性字段,queue = Queue.new thread = Thread.new do queue.push :ready # background work end queue.pop # other work 不会返回私有支持字段GetProperties,但_name会返回。您可以连接字段和属性,两者都是GetFields

MemberInfo

答案 1 :(得分:0)

您关注的元数据有两种类型:FieldInfo描述字段,PropertyInfo描述属性。 这是一个打印给定实例的完整元数据的方法:

private static void PrintMetadata(Test item)
{
    Type type = item.GetType();

    FieldInfo[] fields = type.GetFields(BindingFlags.GetField | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
    foreach (var field in fields)
    {
        Console.WriteLine(field.Name + " :: " + field.GetValue(item));
    }

    PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.GetProperty);
    foreach (var property in properties)
    {
        Console.WriteLine(property.Name + " :: " + property.GetValue(item));
    }
}

只需从循环中为每个项目调用它,如下所示:

var listnew = new List<Test>
{
    new Test {Name = "Test1"}
};

foreach (var item in listnew)
{

    PrintMetadata(item);
}

希望这有帮助。