如何将类型名称转换为字符串类型?好吧,我一整天都在为这个想法疯狂,我已经到了承认我不知道的地步。可能我正在做的事情很愚蠢,而且有更好的方法,但这就是我的想法。我正在尝试使用通用方法在WinForms中加载一个表单:protectedvoidLoadForm(refTformToShow,boolautoLoaded)whereT:FormWithWorker,new(){//Dosomestuff}表单由ToolStripMenuItem(或者通过选择一个项目或使用“打开Windows”菜单项)。它们是延迟加载的,因此MDI父级中的表单有字段,但在需要它们之前它们是空的。我有一个处理所有菜单项点击的通用方法ToolStripMenuItem_Click。除了ToolStripMenuItem的名称与其对应的表单类名称所选择的模式相匹配之外,该方法没有真正知道调用哪个表单的方式。因此,使用ToolStripMenuItem的名称,我可以给出请求的表单类型的名称,并分配一个私有字段的名称来存储对该表单的引用。使用它,我可以使用具有硬编码类型和字符串匹配的增长/收缩switch语句来调用具有特定类型集的方法(不需要),或者我可以使用反射获取一个字段并创建该类型的实例.我遇到的问题是System.Activator.CreateInstance提供了一个无法转换为我需要的类型的ObjectHandler。这是我到目前为止的一小部分:stringformName="_form"+((ToolStripMenuItem)sender).Name.Replace("ToolStripMenuItem","");字符串formType=formName.Substring(1);FieldInfofi=this.GetType().GetField(formName,BindingFlags.NonPublic|BindingFlags.Instance);FormWithWorkerformToLoad=(FormWithWorker)fi.GetValue(this);如果(formToLoad==null){formToLoad=(?????)System.Activator.CreateInstance("MyAssemblyName",formType);}this.LoadForm(refformToLoad,false);fi.SetValue(this,formToLoad);我知道(????)类型的字符串名称,但在编译时我不知道类型,因为它发生了变化。我已经尝试了一些方法来使这个转换/实例化工作,但没有一个起作用。我非常想知道是否可以执行这样一个只知道字符串类型的转换。我尝试使用Type.GetType(string,string)来执行转换,但编译器不喜欢它。如果有人对如何动态加载表单有不同的想法,因为我只是在愚蠢地做这件事,请告诉我。最好使用Type并使用其他重载,如Type.GetType(string)。FormWithWorkerformToLoad=(FormWithWorker)fi.GetValue(this);如果(formToLoad==null){formToLoad=(FormWithWorker)System.Activator.CreateInstance(Type.GetType("MyNamespace.MyFormType"));这个问题通常通过强制Cast到一个公共基类或接口来解决,以解决所有可能的类型。在C#4中,您还可以将其分配给动态变量以保存返回值并对其调用任意方法。这些方法将被后期绑定。但是,我想尽可能地坚持以前的解决方案。根据您所拥有的,FormWithWorker必须(至少)是您实例化类型的基类,因此您可以这样做:FormWithWorkerformToLoad=(FormWithWorker)fi.GetValue(this);如果(formToLoad==null){formToLoad=(FormWithWorker)System.Activator.CreateInstance("MyAssemblyName",formType);虽然通用接口是解决此问题的一种方法,但接口并非适用于所有场景。上面的决定是使用工厂模式(switch语句-具体类选择)还是使用反射。有一个堆栈帖子可以解决这个问题。相信你可以直接把它应用到你的问题上:方法工厂-案例与反思以上是C#学习教程:Howtousetypenameasstringtotype?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
