Подготовьте список полей и отображаемых имен для каждого DbSet в DbContext - PullRequest
0 голосов
/ 12 марта 2020

В моем проекте (MVC5, EF6, .Net4.8) мне нужно подготовить документ, который содержит список всех имен полей и их DisplayNames. Например, в моем DbContext есть следующие классы:

public class Teacher
{
    [Key]
    public int Id { get; set; }
    [Display(Name = "First name of the teacher")]
    public string FirstName { get; set; }
    [Display(Name = "Last name of the teacher")]
    public string LastName { get; set; }
    [Display(Name = "Phone number of the teacher")]
    public string Phone { get; set; }
}

public class Student
{
    [Key]
    public int Id { get; set; }
    [Display(Name = "First name of the student")]
    public string FirstName { get; set; }
    [Display(Name = "Last name of the student")]
    public string LastName { get; set; }
    [Display(Name = "Birthdate of the student")]
    public DateTime Birthdate { get; set; }
}

И мне нужен список каждого имени поля и соответствующего ему DisplayName, как показано ниже:

["Teacher", "Id", null]
["Teacher", "FirstName", "First name of the teacher"]
["Teacher", "LastName", "Last name of the teacher"]
["Teacher", "Phone", "Phone number of the teacher"]

["Student", "Id", null]
["Student", "FirstName", "First name of the student"]
["Student", "LastName", "Last name of the student"]
["Student", "Birthdate", "Birthdate of the student"]

Возможно ли создать такой список автоматически?

Ответы [ 2 ]

2 голосов
/ 12 марта 2020

Вы можете использовать отражение:

typeof(YourContext)
    .GetProperties()
    .Where(prop => prop.PropertyType.IsGenericType
        && prop.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>))
    .SelectMany(dbSet => dbSet.PropertyType.GetGenericArguments()
        .Single()
        .GetProperties()
        .Select(prop => new [] { prop.DeclaringType.Name, prop.Name, prop.GetCustomAttribute<DisplayAttribute>()?.Name }))
    .ToList();

Это сначала перебирает все свойства YourContext, отфильтровывает те, которые имеют тип DbSet<>, затем перебирает свойства generi c тип каждого DbSet<> и выбирает сплющенный список массивов в запрошенном вами формате.

0 голосов
/ 12 марта 2020

Вы можете использовать Отражение , чтобы получить ожидаемый результат:

private static List<List<string>> GetMembers(Type type)
{
    return type.GetProperties()
    .Select(x => new List<string> 
    { 
        type.Name, 
        x.Name, 
        (x.GetCustomAttribute(typeof(DisplayAttribute)) is DisplayAttribute displayAttribute) ? displayAttribute.Name : null 
    })
    .ToList();
}

Тест

List<List<string>> mebmers = GetMembers(typeof(Teacher));

Результат:

foreach(var item in mebmers)
{
   Console.WriteLine(string.Join(",", item));
}

Надеюсь, это поможет вам.

...