Я бы хотел, чтобы все свойства были оформлены атрибутом AggregateAuthorizeIdentifier.Это основной функционал, поэтому он должен быть максимально быстрым.
Я могу искать рекурсивно по всем свойствам, но я бы проверил все системные и сторонние библиотеки.Но это не оптимальное решение.
Сталкивались ли вы с такой проблемой?
public class ReadOrderHistoryQuery
{
public List<string> Ordering { get; set; }
public Criteria Criteria { get; set; }
public class Criteria
{
[AggregateAuthorizeIdentifier]
public int UserId { get; set; }
public string InvoiceId { get; set; }
}
}
мое решение:
static IEnumerable<PropertyWithAttribute> GetAuthorizeIdentifierAttribute(object command)
{
var attributedProperties = GetAuthorizeIdentifierAttribute(command.GetType());
return attributedProperties;
}
static IEnumerable<PropertyWithAttribute> GetAuthorizeIdentifierAttribute(Type type)
{
//check current property
var result = type.GetProperties()
.Where(prop => Attribute.IsDefined(prop, typeof(AggregateAuthorizeIdentifierAttribute)))
.Select(p => new PropertyWithAttribute()
{
Property = p,
Attribute = p.GetCustomAttribute<AggregateAuthorizeIdentifierAttribute>(true)
})
.ToList();
//deeper check all properties
result.AddRange(type.GetProperties()
.SelectMany(p => GetAuthorizeIdentifierAttribute(p.PropertyType)));
return result;
}