在Windows应用程序中,使用C#,我有一个报告模块,它将依赖于类来填充报告。但是会有很多报告,我不想为每个报告编写代码。
流程将如下: 在报告编辑器中,将为报告分配一个类(即“应用程序”)作为字符串。 当用户选择要运行的报告时,代码将从SQL查询中获取数据。 代码将获取数据并找出将数据放入哪个类。 然后报告将使用该类并使用该类中的数据填充报告。
这是我的困境,如何使代码动态化,以便代码将指定的类转换为适当的类对象?
记住示例:
gVar = Report;
(gVar.ReportClass)oClass = new gVar.ReportClass;
答案 0 :(得分:8)
使用Type.GetType
(特别是带有string
参数的重载之一(例如,Type.GetType(string)
)来加载适当类的Type
实例,以及然后在Type
的实例上使用Activator.CreateInstance
或Type.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);