Получить имя свойства и тип, который он ожидает от объекта

1

Как я могу получить все имена свойств и тип значения, который он ожидает от объекта?

Предположим, что у меня есть эти 2 класса сущностей:

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 ожидает строку"
  • и т.д...

Я знаю, что это может быть сделано по одному свойству за раз, но есть ли более элегантный способ сделать это, поскольку класс сущности имеет много свойств (и они меняются от типа, поскольку он все еще находится в разработке) и имеет сложные объекты, для которых я хочу делать то же самое?

EDIT, это нужно сделать рекурсивно. Просто передача Blog не зная, содержит ли он другой пользовательский объект, такой как " Post, не является тем, что я ищу.

  • 0
    Сложный объект в этом случае определяется пользователем. В этом случае и Blog и Post являются сложными объектами (или определенными пользователем).
Теги:
reflection
types

2 ответа

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 s.

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));
  • 2
    Правильная грамматика, хорошая!
  • 0
    Да, хороший трюк с грамматикой!
Показать ещё 11 комментариев
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());
  • 0
    Я думаю, что вы имели в виду GetAllProperties<Blog>() :)
  • 0
    Может быть, это ListAllProperties или PrintAllProperties . Get предполагает получение чего-то обратно.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню