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

时间:2011-02-02 15:57:16

标签: c# string class dynamic

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

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

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

记住示例:

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

4 个答案:

答案 0 :(得分:8)

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

所以,像

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

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

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

答案 1 :(得分:4)

您可以使用反射来完成它。如果你给他们所有类似的基类或接口,你可以做类似的事情:

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

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

答案 2 :(得分:2)

你可以使用隐式运算符:

这对你的需求来说听起来不错,因为它可以让你做类似的事情:

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

或者:

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

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

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

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

编辑2:

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

您可以定义一些属性,例如“ReportPropertyAttribute”,没有属性,默认构造函数,以及使用反射检查标记为建议属性的属性。

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

我希望这符合您的需求!

答案 3 :(得分:2)

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

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