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 所做的等效的事情,并动态生成您自己的助手程序集。
或者你可以硬着头皮使用我上面的逻辑,尽管它很丑陋且不可扩展。
我正在使用外部 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 所做的等效的事情,并动态生成您自己的助手程序集。
或者你可以硬着头皮使用我上面的逻辑,尽管它很丑陋且不可扩展。