Activator.CreateInstance()问题我有一个工厂,它应该在运行时创建从类Foo继承的对象。我以为System.Activator.CreateInstance的返回类型和它创建的对象的类型一样,但是从下面的错误信息来看,它的返回类型是Object。错误1??无法将类型“object”隐式转换为“cs_sandbox.Foo”。有一个明确的演员(你错过了一个演员吗?)F:projectscs_sandboxForm1.cs4624cs_sandbox好吧,也许我错过了一个演员,但是return(t)System.Activator.CreateInstance(t);导致另一条错误消息-我必须承认-这对我来说没有意义:错误1??找不到类型或命名空间名称“t”(是否缺少using指令或程序集引用?)F:projectscs_sandboxForm1.cs4525cs_sandbox这是我的如果(s.StartsWith("abcdef")){t=typeof(FooChild1);返回System.Activator.CreateInstance(t);}else{t=typeof(FooChild2);返回System.Activator.CreateInstance(t);}}}如何修复这段代码?或者,如果它不可修复,还有哪些其他方法可以在运行时创建从特定类继承的对象?您需要将返回的对象Foo转换为Foo类型。将其转换为变量中定义的类型没有意义。编译器应该知道这一点,因为通过继承层次结构的全部意义在于满足编译器的静态类型检查。返回(Foo)System.Activator.CreateInstance(t);有一个通用版本System.Activator.CreateInstance,它创建一个已知类型(不是类型变量,而是类型参数或静态已知类型,在后一种情况下,它没有多大意义):returnSystem.Activator.CreateInstance();我必须在激活后使用UnWrap()方法,如MSDN中所述://创建在名为ObjectHandleAssembly.ObjectHandle的程序集中定义的MyType的实例obj=domain.CreateInstance("ObjectHandleAssembly","MyType");//将代理解包到在另一个AppDomain中创建的MyType对象。MyTypetestObj=(MyType)obj.Unwrap();如MSDN所述。另外,我不得不使用这样的参数:ObjectHandleobj=domain.CreateInstance("Other.Assembly.Name","Full.Class.Namespace.ClassName");更改代码后,只需将结果转换为Foo并返回System.Activator.CreateInstance(t)asFoo;或返回(Foo)System.Activator.CreateInstance(t);第一个更健壮,因为在不太可能的情况下你不会得到异常。它只会返回空值。但这取决于你想要什么。在更改代码之前是否尝试过泛型?publicstaticOutTypeCreateInstance(strings){类型t;如果(s.StartsWith("abcdef")){t=typeof(Bar);返回System.Activator.CreateInstance(t)作为OutType;}else{t=typeof(嗯);返回System.Activator.CreateInstance(t)作为OutType;但是你确实有问题。在您现有的静态方法中,您试图返回与Foo无关的Bar和Meh。这将始终是一个例外,除非您的方法还返回一个对象或一个共同的祖先类型(如在强制转换中)。要控制更多的内部类型,您可以定义方法内部使用的多个泛型类型。我认为你应该这样做:}else{return(Foo)Activator.CreateInstance("Foo.FooChild1,FooChild2");我的观点是,在此代码中,CreateInstance方法没有直接引用包含FooChild1和FooChild2的程序集。在您的原始代码中,您通过显式命名FooChild1和FooChild2创建了类型,因此您可能只是新建它们而不是激活它们。你能理解吗?我认为正确的是:publicstaticFooCreateInstance(stringobjectIdentifer){if(objectIdentifier=="Child1"){return(Foo)Activator.CreateInstance(Type.GetType("Foo.FooChild1,FooChild1"));}else{return(Foo)Activator.CreateInstance(Type.GetType("Foo.FooChild1,FooChild2"));希望这可能有点晚但如果我不知道类型(如果你构建自己的代码分析器)我使用Convert.ChangeTypestringoriginal="1";对象值;value=Convert.ChangeType(原始,typeof(int));typeof(int)可以是你不知道的任何类型object.GetType();以上就是C#学习教程的全部内容:Activator.CreateInstance(),欢迎分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
