C#将动态字符串转换为现有类

在Windows应用程序中,使用C#,我有一个报告模块,它将依赖于类来填充报告。 但是会有很多报告,我不想为每个报告编写代码。

流程将如下:在报告编辑器中,将为报告分配一个类(即“应用程序”)作为字符串。 当用户选择要运行的报表时,代码将从SQL查询中获取数据。 代码将获取数据并找出将数据放入哪个类。 然后报告将使用该类并使用该类中的数据填充报告。

这是我的困境,我如何使代码动态化,以便代码将指定的类转换为适当的类对象?

示例:

gVar = Report; (gVar.ReportClass)oClass = new gVar.ReportClass; 

使用Type.GetType (特别是带有string参数的重载之一(例如, Type.GetType(string) )来加载相应类的Type实例,然后在该实例上使用Activator.CreateInstanceType.GetConstructor Type实例化实例。

所以,像

 Type type = Type.GetType(assemblyQualifiedName); object instance = Activator.CreateInstance(type); 

请注意,除非类型位于mscorlib或当前正在执行的程序集中,否则必须传递程序集限定名 。

此外, Activator.CreateInstance假定存在默认构造函数。 如果没有默认构造函数,或者您需要将一些参数传递给构造函数,则必须使用Activator.CreateInstance的重载来指定构造函数参数,或使用Type.GetConstructor来加载相应的构造函数。

你可以使用reflection来做到这一点。 如果你给他们所有类似的基类或接口,你可以这样做:

 myBaseReport report = (myBaseReport)System.Activator.CreateInstance("MyAssemblyName", myClassStringWithFullNameSpace).Unwrap(); 

这将进入名为的程序集并直接加载该类。 类字符串是有问题类型的全名,因此类似于MyGlobalNamespace.MyCustomNameSpace.MySpecificType 。 这将允许您创建特定类型的报告并将其放入基类类型或接口类型。

有点不清楚你在这里要求的确切内容。 根据我正在阅读的内容,您有一个包含类型名称的字符串,并且您希望基于此实例化一个类?您可以使用reflection来执行此操作…

 Type type = Type.GetType(strTypeName); object oClass = Activator.CreateInstance(type); 

你可以使用隐式运算符:

这对你的需求来说听起来不错,因为它允许你做以下事情:

 Orange orange = new Orange(); Apple apple = (Apple)orange; 

要么:

 string appleJson = "{ Weight: '2kg' }"; Apple apple = appleJson; 

隐式运算符会将apple-JSON序列化的字符串反序列化为常规的Apple类型对象。

我不知道这是否是您正在寻找的,我希望没有人会投票,如果这是一个可用的C#function。

编辑:我误解了这个问题。 感谢评论者,即使是对我的回答进行了投票,因为我错了。

编辑2:

采取其他激活/reflection方法 – 这似乎是当前问题的作者的正确方法 – 并阅读他的另一个问题“如何填充所获得的报告实例的属性”,我想建议一些解决方案。

您可以定义一些属性,如“ReportPropertyAttribute”,不带属性,默认构造函数,以及使用reflection检查属性,这些属性标记为建议属性。

或者您可以定义一些配置文件或配置部分(常规.NET配置API),因此您可以定义“已知报告类型”和“哪些属性是某些报告类型的参数或参数”。

我希望这符合您的需求!