当前位置: 首页 > 编程语言 > C#

通过字符串值获取类分享

时间:2023-04-10 15:17:07 C#

通过字符串值获取类我有一个抽象类publicabstractclassMyObject{publicstringname{get;放;}publicboolIsObject(字符串模式);...}publicclassMyObjectA:MyObject{publicstringname{get{return"MyObjectA";}放;}publicboolIsObject(stringpattern){...}...}publicclassMyObjectB:MyObject{publicstringname{get{return"MyObjectB";}放;}publicboolIsObject(stringpattern){...}...}现在我想要一个返回我的特定类(MyObjectA/MyObectB)的函数。问题是,我有很多if/else子句来获取它:publicMyObjectCreate(stringpattern){MyObjectAobj=newMyObjectA();if(obj.IsObject(pattern){returnobj;}else{MyObjectBobjb=newMyObjectB();if(objb.IsObject(pattern);returnobjb;else...}}这看起来很可怕。什么是更好的方法做这个吗?是的,使用反射。您可以使用Type.GetType通过字符串获取类的Type实例,然后使用Activator.CreateInstance实例化它,如下所示:publicMyObjectCreate(stringpattern){Typet=Type.GetType(pattern);if(t==null){thrownewException("Type"+pattern+"notfound.");}返回Activator.CreateInstance(t);您还可以使用Activator.CreateInstance(string,string)重载,但这不会直接返回所需类型的新实例。您可以使用Reflection或System.Activator.CreateInstance创建一个基于Type或TypeName作为字符串的实例。正如RudiVisser所说,你应该使用反射。此外,要获得您的班级名称,您不应该对其进行硬编码。如果您想使用您的名称属性,只需编写publicabstractclassMyObject{publicstringname{get{returnthis.GetType().Name;}}publicboolIsObject(字符串模式);...}如果你没有类名,只有一些字符串代表它,那么你可以检查从MyObject派生的所有类foreach(Typetypeintypes.Where(t=>t.IsSubclassOf(typeof(MyObject)))){MyObjectobj=(MyObject)Activator.CreateInstance(type);if(obj.name==pattern){returnobj;}}thrownewException("Type"+pattern+"notfound.");您提出的问题有很多好的答案。但是,我建议您使用工厂模式来满足此类需求。您的“工厂”可能类似于向基类添加静态GetNewMyObject(stringpattern)方法以及受保护的静态Dictionary。然后派生类可以简单地将它们的模式+类型添加到工厂(在静态构造函数中),从而允许将新的派生类添加到工厂而无需修改基类。这样你的“模式”字符串就不必匹配类型名称,也不需要像你写的那样进行任何逻辑模式匹配:[图案]);它可以像这样使用反射来完成...publicobjectgetInstance(stringassemblyName,stringclassName,object[]constructorParameters){返回asm.CreateInstance(className,false,System.Reflection.BindingFlags.CreateInstance,null,constructorParameters,null,null);}assemblyName-完整路径+程序集名称className-完全限定的类名获取类共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: