如何在C#中打印类的道具名称[重复]
Posted
技术标签:
【中文标题】如何在C#中打印类的道具名称[重复]【英文标题】:How to print prop name of a class in C# [duplicate] 【发布时间】:2016-12-31 20:49:06 【问题描述】:我有一个名为 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[]
请告诉我我该怎么做,或者我能不能做到这一点
【问题讨论】:
您正在尝试打印出一个对象数组,您希望它做什么?Console.WriteLine(string.Join(", ", s));
这将打印出字段的名称,不是属性。
【参考方案1】:
虽然它们在语法上看起来很相似,但属性不是字段。请改用GetProperties
:
var props = m.GetType().GetProperties();
或
var props = typeof(MyClass).GetProperties();
应该这样打印:
foreach (var p in props)
Console.WriteLine(p.Name);
【讨论】:
建议 typeof 避免实例化类型的好点【参考方案2】:如果您使用的是 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());
【讨论】:
【参考方案3】:我知道其他人也有类似的答案,但我只是想添加一些其他项目。先上代码:
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() 来获取表示集合中所有项目的连接值的字符串。如果你愿意,你可以编写一个扩展方法来做到这一点。
【讨论】:
以上是关于如何在C#中打印类的道具名称[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 二进制文件中打印所有 Objective-C 类的名称?