Как указатель «this» может быть неинициализирован внутри класса? [закрыто]

У меня были некоторые проблемы с решением ответа Кирана Шалы. Вот моя модификация.

Проблема была в методе

private IEnumerable<FilterInfo> OrderFilters(IEnumerable<IFilter> filters, FilterScope scope)
{
    return filters.OfType<IOrderedFilter>()
                    .OrderBy(filter => filter.Order)
                    .Select(instance => new FilterInfo(instance, scope));
}

Как вы можете видеть, будут возвращены только те фильтры, которые реализуют IOrderedFilter.

Итак, у меня было два возможных решения.

  1. Использовать наследование для создания расширенной версии стороннего атрибута, чтобы он также реализовал IOrderFilter.
  2. Измените метод для обработки каждого атрибута, который не реализует IOrderFilter, как атрибут IOrderFilter с порядковым номером 0 и объединяет его с атрибутами IOrderFilter, упорядочить и вернуть их.

Второе решение лучше, потому что оно позволяет мне принести свой атрибут IOrderFilter перед сторонними атрибутами, которые не реализуют IOrderFilter.

Образец

[NonOrderableThirdPartyAttribute]
[OrderableAttributeA(Order = -1)]
[OrderableAttributeB(Order = 1)]
[OrderableAttributeC(Order = 2)]
public async Task<IHttpActionResult> Post(... request) 
{
    // do something
}

Таким образом, выполнение будет

  • OrderableAttributeA
  • NonOrderableThirdPartyAttribute
  • OrderableAttributeB
  • OrderableAttributeC
  • ]

Итак, вот модифицированный код

public class OrderedFilterProvider : IFilterProvider
{
    public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
    {
        // controller-specific
        var controllerSpecificFilters = OrderFilters(actionDescriptor.ControllerDescriptor.GetFilters(), FilterScope.Controller);

        // action-specific
        var actionSpecificFilters = OrderFilters(actionDescriptor.GetFilters(), FilterScope.Action);

        return controllerSpecificFilters.Concat(actionSpecificFilters);
    }

    private IEnumerable<FilterInfo> OrderFilters(IEnumerable<IFilter> filters, FilterScope scope)
    {
        // get all filter that dont implement IOrderedFilter and give them order number of 0
        var notOrderableFilter = filters.Where(f => !(f is IOrderedFilter))
            .Select(instance => new KeyValuePair<int, FilterInfo>(0, new FilterInfo(instance, scope)));

        // get all filter that implement IOrderFilter and give them order number from the instance
        var orderableFilter = filters.OfType<IOrderedFilter>().OrderBy(filter => filter.Order)
            .Select(instance => new KeyValuePair<int, FilterInfo>(instance.Order, new FilterInfo(instance, scope)));

        // concat lists => order => return
        return notOrderableFilter.Concat(orderableFilter).OrderBy(x => x.Key).Select(y => y.Value);
    }
}
-8
задан user1871183 19 January 2013 в 22:41
поделиться