2

の依存関係の解決に問題があります。これは、タイプの共分散と逆分散に関連している可能性があります。

次のプログラムは 0, 1 を返します。これは、resolve の 2 つの呼び出しが同じ型を返さないことを意味します (ただし、型を取得するのは同じオブジェクトです)。(違いは、var の静的型が異なることです。ランタイム型を使用する方法はありますか?)

ありがとう

IContainer _container;

void Main()
{
    var builder = new ContainerBuilder();
    builder.RegisterType<AHandler>().As<IHandler<A>>();
    _container = builder.Build();

    IBase a = new A();
    Console.WriteLine(Resolve(a));
    A b = new A();
    Console.WriteLine(Resolve(b));
}

int Resolve<T>(T a) where T:IBase
{
    return _container.Resolve<IEnumerable<IHandler<T>>>().Count();
}

// Define other methods and classes here
interface IBase{}
interface IHandler<T> where T:IBase {}

class A : IBase{}

class AHandler : IHandler<A>{}
4

1 に答える 1

1

タイプのある種の実行時解決を行う必要があります。たとえば、次のdynamicキーワードを使用します。

IBase a = new A();
Console.WriteLine(Resolve((dynamic)a));
A b = new A();
Console.WriteLine(Resolve((dynamic)b));

または反射を使用して:

int ResolveDynamic(IBase a)
{
    MethodInfo method = typeof(IContainer).GetMethod("Resolve");
    var handlerType = typeof(IHandler<>).MakeGenericType(a.GetType());
    var enumerableType = typeof(IEnumerable<>).MakeGenericType(handlerType);
    MethodInfo generic = method.MakeGenericMethod(enumerableType);

    var result = (IEnumerable<object>)generic.Invoke(_container, null);
    return result.Count();
}
于 2013-07-23T19:14:43.670 に答える