如何在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[]
请告诉我如何才能做到这一点或我可以这样做或不
虽然它们在语法上看起来很相似,但属性不是字段。使用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()来获取表示集合中所有项的连接值的字符串。如果你愿意的话,你可以写一个扩展方法来做这件事。