Как я могу получить все имена свойств и тип значения, который он ожидает от объекта?
Предположим, что у меня есть эти 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; }
}
Как я могу получить это как результат:
Я знаю, что это может быть сделано по одному свойству за раз, но есть ли более элегантный способ сделать это, поскольку класс сущности имеет много свойств (и они меняются от типа, поскольку он все еще находится в разработке) и имеет сложные объекты, для которых я хочу делать то же самое?
EDIT, это нужно сделать рекурсивно. Просто передача Blog
не зная, содержит ли он другой пользовательский объект, такой как " Post
, не является тем, что я ищу.
Конечно, используйте отражение.
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));
Вы можете использовать отражение для этого и сделать что-то вроде:
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());
GetAllProperties<Blog>()
:)
ListAllProperties
или PrintAllProperties
. Get
предполагает получение чего-то обратно.
Blog
иPost
являются сложными объектами (или определенными пользователем).