我有一个名为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[]
请告诉我,我该怎么办?或者我可以这样做
答案 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()来获取表示集合中所有项的连接值的字符串。如果您愿意,可以编写一个扩展方法来执行此操作。