Мы можем использовать рекурсию для проблем с комбинацией / перестановкой, включающую строку или целые числа.
public static void Main(string[] args)
{
IntegerList = new List<int> { 1, 2, 3, 4 };
PrintAllCombination(default(int), default(int));
}
public static List<int> IntegerList { get; set; }
public static int Length { get { return IntegerList.Count; } }
public static void PrintAllCombination(int position, int prefix)
{
for (int i = position; i < Length; i++)
{
Console.WriteLine(prefix * 10 + IntegerList[i]);
PrintAllCombination(i + 1, prefix * 10 + IntegerList[i]);
}
}
Сделайте универсальный атрибут: MyFilterAttribute с ctor взятие Типа как аргумент - т.е. что-то вроде этого:
public class MyFilterAttribute : ActionFilterAttribute {
public MyFilterAttribute(Type serviceType) {
this.serviceType = serviceType;
}
public override void OnActionExecuting(FilterExecutingContext c) {
Container.Resolve<IFilterService>(serviceType).OnActionExecuting(c);
// alternatively swap c with some context defined by you
}
// (...) action executed implemented analogously
public Type ServiceType { get { return serviceType; } }
public IWindsorContainer Container { set; get; }
}
Затем используют тот же подход в качестве этих двух статей, к которым Вы обращаетесь, чтобы взять под свой контроль, как действия вызываются и делают ручную инжекцию Вашего WindsorContainer в атрибут.
Использование: [MyFilter (typeof (IMyFilterService))]
Вашим фактическим фильтром затем будет в реализации класса IMyFilterService, который в свою очередь должен реализовать IFilterService, который мог выглядеть примерно так:
public interface IFilterService {
void ActionExecuting(ActionExecutingContext c);
void ActionExecuted(ActionExecutedContext c);
}
Этим способом, которым Ваш фильтр даже не будет связан с ASP.NET MVC и Ваш атрибут, является просто часть метаданных - способ, которым это, как на самом деле предполагается! :-)
Когда мне это было нужно, я опирался на работу другие сделали с Ninject и Windsor, чтобы получить зависимости внедрения свойств от моих ActionFilters .