我有一个工厂,它应该创建在运行时继承类Foo的对象。我认为System.Activator.CreateInstance的返回类型与它正在创建的对象的类型相同,但是从下面的错误消息来看,它的返回类型是Object。
错误1不能隐式地将类型'object‘转换为'cs_sandbox.Foo’。存在显式转换(是否缺少强制转换?)F:\projects\cs_sandbox\Form1.cs 46 24 cs_sandbox
好吧,也许我错过了演员阵容,但是
return (t)System.Activator.CreateInstance(t);结果产生了另一条错误信息--我必须承认--对我来说是毫无意义的:
错误1无法找到类型或命名空间名称“t”(您是缺少了使用指令还是程序集引用?)F:\projects\cs_sandbox\Form1.cs 45 25 cs_sandbox
这是我的密码:
class Foo { }
class FooChild1 : Foo { }
class FooChild2 : Foo { }
class MyFactory
{
public static Foo CreateInstance(string s)
{
Type t;
if (s.StartsWith("abcdef"))
{
t = typeof(FooChild1);
return System.Activator.CreateInstance(t);
}
else
{
t = typeof(FooChild2);
return System.Activator.CreateInstance(t);
}
}
}我怎样才能修正这段代码?或者,如果它是不可修复的,那么在运行时创建从特定类继承的对象的其他方法是什么?
发布于 2009-09-27 21:53:36
您需要将返回的对象转换为Foo类型。将其转换为在变量中定义的类型是没有意义的。编译器应该知道这一点,因为通过继承层次结构转换的全部内容都满足编译器的静态类型检查。
return (Foo)System.Activator.CreateInstance(t);有一个泛型版本System.Activator.CreateInstance<T>,它创建一个已知类型(不是类型变量,而是类型参数或静态已知类型,在后一种情况下,它没有多大意义):
return System.Activator.CreateInstance<FooChild1>();发布于 2012-10-15 09:51:00
激活后,我不得不使用UnWrap()方法,就像MSDN中描述的那样:
// Creates an instance of MyType defined in the assembly called ObjectHandleAssembly.
ObjectHandle obj = domain.CreateInstance("ObjectHandleAssembly", "MyType");
// Unwrapps the proxy to the MyType object created in the other AppDomain.
MyType testObj = (MyType)obj.Unwrap();正如所描述的论MSDN。此外,我还必须使用这样的参数:
ObjectHandle obj = domain.CreateInstance("Other.Assembly.Name", "Full.Class.Namespace.ClassName");发布于 2009-09-27 22:12:46
我觉得你应该这么做:
public static Foo CreateInstance(string objectIdentifer)
{
if (objectIdentifier == "Child1")
{
return (Foo)Activator.CreateInstance("Foo.FooChild1, FooChild1");
}
else
{
return (Foo)Activator.CreateInstance("Foo.FooChild1, FooChild2");
}
}我的观点是,在这段代码中,CreateInstance方法没有直接引用包含FooChild1和FooChild2的程序集。在原始代码中,您可以通过显式命名FooChild1和FooChild2来创建一个类型,所以您最好只是更新它们,而不是激活它们。
这对你有意义吗?
https://stackoverflow.com/questions/1484577
复制相似问题