为实现指定多个泛型类型

时间:2014-07-15 10:14:49

标签: c# generics castle-windsor

鉴于以下服务结构:

public interface IFoo
{
    void Print();
}

public class Foo<T> : IFoo
{
    private T _item;

    public Foo(T item)
    {
        _item = item;
    }

    public void Print()
    {
        Console.WriteLine(_item);
    }
}

我有没有办法让Foo<T>组件注册多种类型,而不是明确枚举它们?这有效,但我认为可能有更好的方法:

foreach (var t in myTypes)
{
    container.Register(Component.For<IFoo>()
        .ImplementedBy(typeof(Foo<>).MakeGenericType(new[] { t })));
}

1 个答案:

答案 0 :(得分:1)

您在foreach type循环中所做的工作是将开放通用组件的数量减少到与IFoo相同的数量;有一种方法可以使用Castle IGenericImplementationMatchingStrategy interface将它包装在一个干净的实现中,但是这个接口只允许你用一个签名关闭泛型类型;你不能用多种类型关闭泛型类型。

public class YourCustomGenericCloser: IGenericImplementationMatchingStrategy
{
   public Type[] GetGenericArguments(ComponentModel model, CreationContext context)
   {
      if(context.RequestedType == typeof(IFoo))
      {
         return typeof(TheDefaultTypeToCloseAgainst);
      }
      return null;
   }
}

我认为到目前为止,您的方法可能是在基本接口上注册具体泛型类型的简单方法。