使用依赖注入注入具有泛型类型参数的类?

时间:2016-06-03 08:02:50

标签: c# generics dependency-injection

我们如何使用依赖注入注入具有泛型类型参数的类?

例如,这是我的代码。显然,这不会编译 - 在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应该能够使用任何类型的对象。有没有办法让它发挥作用?

1 个答案:

答案 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});

请注意,在混合反射和泛型时,您不能真正使用泛型类型参数,而是使用某种推理,您可以根据其他机制获取泛型类型,然后沿途使用该类型实例。一种方法是探索类型的泛型参数,如上所示。

请注意这段代码假设很多,故意保持简单,以便明确说明这一点。

相关问题