C# 使用依赖项注入来注入具有泛型类型参数的类?

C# 使用依赖项注入来注入具有泛型类型参数的类?,c#,generics,dependency-injection,C#,Generics,Dependency Injection,我们如何使用依赖项注入来注入具有泛型类型参数的类 例如,下面是我的代码。显然,这不会编译-必须在Main()的第2行和第3行将TOject替换为具体类型,但这违背了全部目的,因为我希望具体TObject依赖于在运行时确定的内容,并确保处理器的类型(通过Activator实例化)是,与CreateNew方法所期望的完全相同。有没有办法让它发挥作用 void Main() { //Get concrete type for TObject here // TObject = somethin

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

例如,下面是我的代码。显然,这不会编译-必须在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();
}
void Main(){
//在此处获取TObject的具体类型
//TObject=某物;
Type Type=Type.GetType(“Namespace.SomeType,SomeAssembly”);
IPProcessor processor=(IPProcessor)Activator.CreateNew(类型);
var proc=ProcessorFactory.CreateNew(处理器);
}
类处理器工厂{
CreateNew(IPProcessor处理器)
}
类异常处理器:IPProcessor{
公共事件处理程序事件;
公共无效剂量测定法(){
调用(新ArgumentOutOfRangeException(“文本”);
}
}
接口处理器{
事件处理程序事件;
无效剂量();
}

这只是一个示例代码,在这种形式下没有什么意义,因为它被简化了,但为什么我需要类似is的东西,是因为essense中的处理器应该能够处理任何类型的对象。有什么方法可以让它工作吗?

这里有一种方法可以做到这一点:

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();
}
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});
请注意,在混合反射和泛型时,不能真正使用泛型类型参数,而是使用某种推理,即根据其他机制获取泛型类型,然后在此过程中使用该类型实例。一种方法是探索类型的泛型参数,如上所示


请注意,这段代码假定了很多内容,并特意保持简单,以便清楚地说明这一点。

我想您需要一些思考才能使其发挥作用。基本上,您不能期望编译器猜测您的程序只在运行时知道的类型,因此您不能将返回的实例转换为任何泛型类型。您应该使用MakeGenericType和MakeGenericMethod的一些组合。谢谢,我来试试这个。但是,您认为这是一种比摆脱泛型、使用“object”类型操作并将其强制转换为所需类型(例如,分配给处理器事件的事件处理程序必须将事件参数强制转换为特定类型)更好的方法吗。我认为这仍然是更好的方法,因为它在那些实例化的类中保持了类型安全性,但我想知道什么是更好的模式@用户5080246。此外,一旦这对您有效,请将答案标记为已接受:)@user5080246正如我在对您的问题的评论中已经提到的那样,编译器无法(静态)推断您在运行时提供的任何类型信息。因此,无论以何种方式,您都被困在“使用对象操作”中。您唯一能做的就是实现某种类型的接口,所有可能的类型都会实现该接口并返回一个
i处理器