如何在C#中打印类的prop名称

时间:2016-08-24 16:00:05

标签: c#

我有一个名为MyClass的类,它有许多属性

class MyClass
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string email { get; set; }

    public string password { get; set; }

    public string city { get; set; }
}

我想在Console.writeline中打印属性名称,如

static void Main(string[] args)
    {
        MyClass m = new MyClass();
        var s = m.GetType()
                 .GetFields();
        Console.WriteLine(s);



        Console.ReadKey();
    }

但它每次都给我

System.Reflection.FieldInfo[]

请告诉我,我该怎么办?或者我可以这样做

3 个答案:

答案 0 :(得分:5)

虽然从语法上讲它们看起来很相似,但属性不是字段。请改用GetProperties

var props = m.GetType().GetProperties();

var props = typeof(MyClass).GetProperties();

应该这样打印:

foreach (var p in props) {
    Console.WriteLine(p.Name);
}

答案 1 :(得分:3)

如果您使用的是c#6,那么现在有一个不错的nameof关键字

nameof(email) returns "email"

然后它们是早期的CallerMemberName属性,可以像这样附加到方法调用

public void MemberName([System.Runtime.CompilerServices.CallerMemberName] string memberName = "")

然后你有反思

Console.WriteLine("Properties of System.Type are:");
foreach (PropertyInfo myPropertyInfo in typeof(MyClass).GetProperties())
{
    Console.WriteLine(myPropertyInfo.ToString());
}

答案 2 :(得分:0)

其他人有类似的答案我知道,但我只是想添加一些其他项目。首先是代码:

IEnumerable<string> names = typeof(MyClass ).GetProperties().Select(prop => prop.Name);

foreach (var name in names)
{
   Console.WriteLine(name);
}

正如其他人所指出的,你对这里的属性(不是字段)感兴趣。如果我将GetProperties()的GetProperties()更改为GetFields(),它将返回一个空集合。但是,如果我将其更改为GetFields(BindingFlags.NonPublic | BindingFlags.Instance),它会给我支持字段的名称(我怀疑它不是您要查找的内容)。

我想补充的另一件事是,ToString()并不总能满足你的期望。在许多情况下(如上所述),您只需获取类型本身的名称(内容)。作为必然结果,您通常不能只使用ToString()来获取表示集合中所有项的连接值的字符串。如果您愿意,可以编写一个扩展方法来执行此操作。