如何在c#中打印类的道具名称

本文关键字:打印 | 更新日期: 2023-09-27 18:03:52

我有一个名为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; }
}

我想在控制台中打印属性名称。Writeline like

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

        Console.ReadKey();
    }

但它每次都给我

System.Reflection.FieldInfo[]

请告诉我如何才能做到这一点或我可以这样做或不

如何在c#中打印类的道具名称

虽然它们在语法上看起来很相似,但属性不是字段。使用GetProperties代替:

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

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

打印应该这样做:

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

如果你使用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());
}

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

IEnumerable<string> names = typeof(MyClass ).GetProperties().Select(prop => prop.Name);
foreach (var name in names)
{
   Console.WriteLine(name);
}

正如其他人指出的那样,您对这里的属性(而不是字段)感兴趣。如果我将GetProperties()调用更改为GetFields(),它将返回一个空集合。然而,如果我将其更改为GetFields(BindingFlags.NonPublic | BindingFlags.Instance),它会给我后备字段的名称(我怀疑这不是你要找的)。

我想补充的另一件事是ToString()并不总是做你期望它做的事情。在许多情况下(如上所述),您只获得类型本身的名称(而不是内容)。作为推论,通常不能只使用ToString()来获取表示集合中所有项的连接值的字符串。如果你愿意的话,你可以写一个扩展方法来做这件事。