我在解决autofac中的依赖项时遇到问题。它可能与类型的共/同方差有关。
以下程序返回0,1。这意味着两次调用resolve不会返回相同的类型(因为它是用于获取类型的相同对象)我希望它返回:1,1。 (不同之处在于我的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>{}
答案 0 :(得分: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();
}