如何从容器中解析正确的类型(静态类型与运行时类型)

本文关键字:类型 静态 静态类 运行时 | 更新日期: 2023-09-27 18:24:00

我在解决autofac中的依赖项时遇到问题。这可能与类型上的协/反差异有关。

以下程序返回0,1。这意味着两个解析调用不会返回相同的类型(因为它是用于获取类型的同一对象),我希望它返回: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>{}

如何从容器中解析正确的类型(静态类型与运行时类型)

您需要进行某种类型的运行时解析。例如,使用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();
}