如何从对象中获取所需的所有属性名称和值类型?
假设我有这两个实体类:
public class Blog
{
public int Id { get; set; }
public string Title { get; set; }
public string BloggerName { get; set;}
public Post Post { get; set; }
}
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public DateTime DateCreated { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public Comment Comment { get; set; }
}
我怎样才能得到这个结果:
我知道这可以一次完成一个属性,但有一种更优雅的方式来实现这一点,因为实体类有很多属性(并且它们仍在开发中时会从类型改变)并且具有复杂的对象我想做同样的事情吗?
编辑,这需要递归完成。只是传递Blog
而不知道它是否包含另一个用户定义的对象,如Post
,并不是我想要的。
答案 0 :(得分:4)
当然使用反射。
foreach (PropertyInfo p in typeof(Blog).GetProperties())
{
string propName = p.PropertyType.Name;
Console.WriteLine("Property {0} expects {1} {2}",
p.Name,
"aeiou".Contains(char.ToLower(propName[0])) ? "an" : "a",
propName);
}
请注意,GetProperties
也有一个接受BindingFlags
的重载,它允许您只获取一些属性,例如instance / static public / private。
下面是一个理论上如何递归工作的例子,尽管在这个简单的例子中,这会创建一个StackOverflowException
,因为DateTime
的属性本身就是DateTime
。< / p>
void ListProperties(Type t)
{
foreach (PropertyInfo p in t.GetProperties())
{
string propName = p.PropertyType.Name;
Console.WriteLine("Property {0} expects {1} {2}",
p.Name,
"aeiou".Contains(char.ToLower(propName[0])) ? "an" : "a",
propName);
ListProperties(p.PropertyType);
}
}
ListProperties(typeof(Blog));
答案 1 :(得分:2)
您可以使用反射并执行以下操作:
public static class Extensions
{
public static void PrintAllProperties<T>(T type)
{
var t = type.GetType();
var properties = t.GetProperties();
Console.WriteLine("Listing all properties for type {0}", t);
foreach (var prop in properties)
{
Console.WriteLine("{0} is of type: {1}", prop.Name, prop.PropertyType);
}
}
}
然后使用:
Extensions.PrintAllProperties(new Blog());
Extensions.PrintAllProperties(new Post());