鉴于以下代码,如何在autofac中解析正确的SomeInstance?
public class BaseClass {}
public class SubClass1 : BaseClass {}
public class SubClass2 : BaseClass {}
public interface IGenericInterface<T> where T : BaseClass {}
public class SomeInstance1<T> : IGenericInterface<T> where T : SubClass1
public class SomeInstance2<T> : IGenericInterface<T> where T : SubClass2
Run Code Online (Sandbox Code Playgroud)
我想根据子类的泛型类型选择SomeInstance1或2.
所以例如我有一个子类的集合(SubClass1,2 ....),并在迭代它们时我想选择正确的SomeInstance类.
and*_*nov 66
Autofac支持开放式泛型.如果在编译时已知泛型类型,则可以使用以下代码:
var builder = new ContainerBuilder();
builder.RegisterGeneric(typeof(SomeInstance1<>))
.As(typeof(IGenericInterface<>));
var container = builder.Build();
var instance1 = container.Resolve<IGenericInterface<SubClass1>>();
Assert.IsInstanceOfType(typeof(SomeInstance1<SubClass1>), instance1);
Run Code Online (Sandbox Code Playgroud)
如果直到运行时才知道type参数(如果你想迭代类型集合,可能就是这种情况),那么你可以使用MakeGenericType构建你的类型:
var typeInRuntime = typeof (SubClass1);
var instance1 = container.Resolve(typeof(IGenericInterface<>).MakeGenericType(typeInRuntime));
Run Code Online (Sandbox Code Playgroud)