Сортировать согласно пользовательскому атрибуту - PullRequest
0 голосов
/ 04 сентября 2018

Пожалуйста, рассмотрите этот код:

public class MyClass
{
    [CustomAttributes.GridColumn(1)]
    public string Code { get; set; }

    [CustomAttributes.GridColumn(3)]
    public string Name { get; set; }

    [CustomAttributes.GridColumn(2)]
    public DateTime? ProductionDate { get; set; }

    public DateTime? ProductionExpiredDate { get; set; }

    [CustomAttributes.GridColumn(4)]
    public int ProductOwner { get; set; }
}

Я хочу получить словарь для всех свойств, которые имеют CustomAttributes.GridColumn и отсортировать их по номеру в атрибуте GridColumn и тип их следующим образом:

PropertyName           Type
---------------------------------
Code                   string 
ProductionDate         DateTime?
Name                   string 
ProductOwner           int 

Как я могу это сделать?

Спасибо

1 Ответ

0 голосов
/ 04 сентября 2018

Как-то так должно работать:

private IDictionary<string, Type> GetProperties<T>()
{
    var type = typeof(T);
    return type.GetProperties(BindingFlags.Instance | BindingFlags.Public)
                .Select(p => new { Property = p, Attribute = p.GetCustomAttribute<CustomAttributes.GridColumnAttribute>() })
                .Where(p => p.Attribute != null)
                .OrderBy(p => p.Attribute.Index)
                .ToDictionary(p => p.Property.Name, p => p.Property.PropertyType);
}

Сначала он получает все открытые свойства, создает объект, который содержит свойство и атрибут, фильтрует список, чтобы включить в него только те свойства, где атрибут существует, сортирует по индексу атрибута и, наконец, преобразует его в словарь.

Я предполагаю, что атрибут определен примерно так:

public class GridColumnAttribute : System.Attribute
{
    public GridColumnAttribute(int index)
    {
        this.Index = index;
    }

    public int Index { get; set; }
}

P.S. GetCustomAttribute<T>() - это метод расширения, который находится в System.Reflection.CustomAttributeExtensions, поэтому убедитесь, что вы включили using System.Reflection;

Попробуйте онлайн

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...