我们如何使用依赖注入注入具有泛型类型参数的类?
例如,这是我的代码。显然,这不会编译 - 在Main()的第2行和第3行必须用具体类型替换TOject,但是这会破坏整个目的,因为我希望具体的TObject依赖于在运行时确定的东西和确保处理器的类型(通过Activator实例化)与CreateNew方法所期望的完全相同。有没有办法让它发挥作用?
void Main() {
//Get concrete type for TObject here
// TObject = something;
Type type = Type.GetType("Namespace.SomeType,SomeAssembly");
IProcessor<TObject> processor = (IProcessor<TObject>)Activator.CreateNew(type);
var proc = ProcessorFactory.CreateNew<TObject>(processor);
}
class ProcessorFactory {
CreateNew<TObject>(IProcessor<TObject> processor)
}
class ExceptionProcessor : IProcessor<Exception> {
public event EventHandler<Exception> event;
public void DoSomething() {
event.Invoke(new ArgumentOutOfRangeException("text"));
}
}
interface IProcessor<TObject> {
event EventHandler<TObject> event;
void DoSomething();
}
这只是一个示例代码,在这种形式中没什么意义,因为它简化了,但为什么我需要类似的东西,因为essense中的Processor应该能够使用任何类型的对象。有没有办法让它发挥作用?
答案 0 :(得分:1)
以下是实现此目的的一种方法:
var processor = Activator.CreateInstance(type);
var objectType = type.GetGenericArguments()[0];
var methodInfo = typeof(ProcessorFactory).GetMethod("CreateNew");
var generic = methodInfo.MakeGeneric(new []{objectType});
var instance = generic.Invoke(factoryinstance,new []{processor});
请注意,在混合反射和泛型时,您不能真正使用泛型类型参数,而是使用某种推理,您可以根据其他机制获取泛型类型,然后沿途使用该类型实例。一种方法是探索类型的泛型参数,如上所示。
请注意这段代码假设很多,故意保持简单,以便明确说明这一点。