C# 通过泛型和依赖注入引入 class 名称?

C# Induce class name through generics and dependency injection?

我正在使用外部 FileHelpers 库通过创建一个 class 来验证我的 csv 文件,其中的属性将与 csv 列相匹配 http://www.filehelpers.net/example/ErrorHandling/ErrorMode.SaveAndContinue/

对于这个实现,我需要传递一个 class 来启动验证引擎,如下所示

var engine = new DelimitedFileEngine<Customer>();

但是我有不同类型的文件,因此 class 名称 Customer 需要参数化。

根据某些值,class 可以是 Customer 、 Employee 等等。

我正在尝试使用

public List<T> ValidateFileData<T>(T className)
{

var engine = new DelimitedFileEngine<T>();
}

我不太确定如何使用它。 还有如何根据一些字符串值设置 Customer 或 Employee class 并将其作为参数传递给此方法?。 我可以选择使用 unitycontainer 并进行依赖注入。关于我的设计应该如何进行的任何线索和见解都会有所帮助..

我假设您希望逻辑像这样的伪代码一样工作:

IDelimitedFileEngine engine= null; // because you're programming to interfaces, right?
switch(className)
{
   case "Customer":
      engine = new DelimitedFileEngine<Customer>();
      break;
   case "Employee":
      engine = new DelimitedFileEngine<Employee>();
      break;
}

确实没有办法将字符串参数映射到泛型 class Something<T>T 类型,除非我采用那种个案逻辑使用上面。如果您想将结果分配给无论 T 是什么都可以工作的变量,则不是。 (除非 Something<T> 是基于非泛型 ISomething,如我的示例。)

那么,你能做什么?那么,您可以尝试使用 System.Linq.Expressions,它可以让您动态构建可以编译和执行的表达式。我的结果好坏参半,但它可能对你有用。

你可以放弃使用泛型的想法,使用老式的反射。它会比您希望的慢,但速度可能不是您最关心的问题。

var targetType = Type.GetType(className);
var engine = new DelimitedFileEngine(targetType); 

这样的好处是可以适应任何你想扔给它的新类型,而不是局限于(如我的例子)你编码它要知道的类型。

您甚至可以在反射的帮助下,做一些与 XmlSerializer 所做的等效的事情,并动态生成您自己的助手程序集。

或者你可以硬着头皮使用我上面的逻辑,尽管它很丑陋且不可扩展。