6

我有一个带有逆变类型参数的接口,比如IFoo

interface IFoo<in T> {}

现在我有三个班:

class B {}

class D : B {}

class Foo : IFoo<B> {}

如果我这样注册它们

container.RegisterType<IFoo<B>, Foo>();

...然后尝试解决IFoo<D>,它失败了,因为我没有真正注册IFoo<D>IFoo<> 。很明显。

我当前的解决方案只是迭代Registrations,找到可从解析类型(在我的情况下)RegisteredType分配的注册,然后解析其类型。IFoo<D>MappedToType

问题很简单:有没有更好的方法来做到这一点?任何意见,将不胜感激。

谢谢你。

编辑:

多一点上下文。

我有某种映射器。

IMapper<in TSource, in TDest> : IMapper // IMapper is non-generic
{
    void Map(TSource source, TDest dest);
}

而且我只想注册基本映射器(在哪里TSourceIEnumerable<T>,并且能够为实现的每种类型解析此映射器IEnumerable<T>,例如T[]

object source = GetSource(); // runtime type is T[]
object dest = GetDest();

Type mapperType = typeof(IMapper<,>).MakeGenericType(source.GetType(), dest.GetType());
IMapper mapper = (IMapper) container.Resolve(mapperType);
mapper.Map(source, dest);

是的,我只对基于 Unity/C# 的方法感兴趣......

4

1 回答 1

0

听起来您每次都想解析同一个 Mapper。如果这是正确的,并且 IEnumerable<> 是您的映射器需要处理的唯一接口,那么您的方法似乎有点矫枉过正。

我会尝试使用非通用注册映射器IEnumerable(),而不是IEnumerable<T>( container.RegisterType<IFoo<IEnumerable>, Foo>();)。如果我没记错的话,泛型IEnumerable<T>可以传递给非泛型IEnumerable()参数,所以你不必担心传递的是什么类型的参数。所以当你去解析你的映射器时,你甚至不需要检查类型,只需要解析IMapper<IEnumerable>

以下代码编译:

[TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {            
            IEnumerable<int> coll = new int[0];
            IEnumerable coll2 = coll;

         var blah = new Test<IEnumerable<int>>();
    }
}

public interface ITest<in T> where T : IEnumerable
{
}

public class Test<T> : ITest<T> where T : IEnumerable { }

如果您需要获得不同的实现IMapper,那就另当别论了。在这种情况下,您必须注册每个实现。

于 2013-05-29T00:15:13.210 回答