Как-то так должно работать:
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;
Попробуйте онлайн