Mis*_*dex 3 c# class instantiation activator
我有一个工厂应该创建在运行时从类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);
Run Code Online (Sandbox Code Playgroud)
导致又一条错误信息 - 我必须承认 - 这对我没有意义:
错误1找不到类型或命名空间名称't'(您是否缺少using指令或程序集引用?)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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我该如何修复此代码?或者,如果它不可修复,那么在运行时创建从特定类继承的对象的其他方法是什么?
Meh*_*ari 11
您需要将返回的对象强制转换为Foo
type.将它强制转换为变量中定义的类型是没有意义的.它应该由编译器知道,因为通过继承层次结构的整个点是满足编译器的静态类型检查.
return (Foo)System.Activator.CreateInstance(t);
Run Code Online (Sandbox Code Playgroud)
有一个通用版本,System.Activator.CreateInstance<T>
它创建一个已知类型(不是类型变量,而是类型参数或静态已知类型,在后一种情况下,它没有太大意义):
return System.Activator.CreateInstance<FooChild1>();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
15494 次 |
最近记录: |