获取属性名称及其对象所需的类型

时间:2015-01-18 15:41:52

标签: c# .net reflection types

如何从对象中获取所需的所有属性名称和值类型?

假设我有这两个实体类:

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.Id需要一个int"
  • " Blog.Title需要一个字符串"
  • " Blog.BloggerName需要一个字符串"
  • " Post.Id需要一个int"
  • " Post.Title需要一个字符串"
  • " Post.DateCreated需要一个字符串"
  • 等...

我知道这可以一次完成一个属性,但有一种更优雅的方式来实现这一点,因为实体类有很多属性(并且它们仍在开发中时会从类型改变)并且具有复杂的对象我想做同样的事情吗?

编辑,这需要递归完成。只是传递Blog而不知道它是否包含另一个用户定义的对象,如Post,并不是我想要的。

2 个答案:

答案 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());