6

反変型パラメーターを持つインターフェイスがあります。たとえば、次のようになりますIFoo

interface IFoo<in T> {}

今、私は3つのクラスを持っています:

class B {}

class D : B {}

class Foo : IFoo<B> {}

このように登録すると

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

...次に を解決しようとしましIFoo<D>たが、実際に登録していないため失敗しますIFoo<D>またはIFoo<> . それは明確だ。

私の現在の解決策は、 を繰り返し処理し、タイプの解決から割り当て可能なRegistrations登録を見つけて(私の場合)、そのタイプを解決することです。RegisteredTypeIFoo<D>MappedToType

質問は簡単です。これを行うためのより良い方法はありますか? アドバイスをいただければ幸いです。

ありがとうございました。

編集:

もう少し文脈。

私はある種のマッパーを持っています。

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

そして、私はベースマッパーのみを登録したい (どこにTSourceある) と、IEnumerable<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

毎回同じマッパーを解決したいようです。そうであり、IEnumerable<> がマッパーが処理する必要がある唯一のインターフェイスである場合、あなたのアプローチは少しやり過ぎのように思えます。

( )IEnumerable()の代わりにnon-generic を使用してマッパーを登録してみます。私の記憶が正しければ、ジェネリックは非ジェネリックパラメータに渡すことができるので、どの型パラメータが渡されるかを気にする必要はありません。したがって、マッパーを解決するときは、タイプを確認する必要さえなく、単に resolve .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 に答える