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

只知道类名就可以创建对象?分享

时间:2023-04-10 19:38:50 C#

只知道类名创建对象?我有一组类,每个类都是完成相同工作的不同策略。namespaceBigCorp.SuperApp{publicclassBaseClass{}publicclassClassA:BaseClass{}publicclassClassB:BaseClass{}}选择使用哪种策略是可配置的。我只想在app.config文件中配置类名“ClassB”,而不是完整的类型名“BigCorp.SuperApp.ClassB”。但是,反射调用失败,因为它们需要完整的类型名称,特别是Typet=Type.GetType("ClassB");//结果t==nullBaseClassc=Activator.CreateInstance(t)asBaseClass;//失败当只配置类名时如何让它工作?将名称空间连接到完整类型名称的类名?还有其他有效的反射调用吗?如果您认为这没有用,我希望配置包含完整的类型名称,我愿意接受这个解决方案!只是提供说服我的理由。(我不从这个程序集/命名空间之外加载类型)现在你知道所有类都来自同一个命名空间,配置一次并使用它:编辑:我将名称更改为类以更好地表示属性的含义。使用程序集限定名称,或获取程序集并使用Assembly.GetType(name)。在这种情况下,由于您需要配置文件中的类型,因此程序集限定是可行的方法-但由于您知道所有类型都在同一个程序集中:Assemblyassembly=typeof(SomeKnownType).Assembly;//在同一个程序集中!输入type=assembly.GetType(name);//全名-即带有命名空间(可能连接)对象obj=Activator.CreateInstance(type);StaticType.GetType(string)有一个经常令人困惑的Theprobingrulefor...它查看调用程序集和一些系统程序集-但不是所有加载的程序集。(我不从这个程序集/命名空间之外加载类型)由于上面的行,可以安全地假设您知道命名空间是什么。你不能这样做:Typet=Type.GetType("Namespace."+className);BaseClassc=Activator.CreateInstance(t)asBaseClass;如果您愿意(可能通过其他程序集),您将来可能能够添加其他策略类,您需要完全限定类名。无论如何,这是推荐的,因为您可以为您的应用程序提供增强的可伸缩性。我将在应用程序配置中使用完整的类型名称。这是一个稍微更完整但仍然很简单的工厂类示例,它实际创建了这个私有静态程序集a=typeof(IFactoryObject).Assembly;publicstaticIFactoryObjectCreateObject(StringproviderName){Typet=a.GetType(providerName)IFactoryObjecto=Activator.CreateInstance(t)asIFactoryObject;返回o;}BaseClassc=Activator.CreateInstance(t)asBaseClass;//失败也可能是因为CreateInstance没有返回BaseClass的实例,而是返回了一个包裹在ObjectHandle中的BaseClass的实例。使用UnWrap方法后,将其转换为BaseClass。以上就是C#学习教程:只知道类名创建对象?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: