加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Activator.CreateInstance()麻烦

发布时间:2020-12-15 20:45:53 所属栏目:百科 来源:网络整理
导读:我有一个工厂应该创建在运行时从类Foo继承的对象.我认为System.Activator.CreateInstance的返回类型与它创建的对象的类型相同,但从以下错误消息判断,其返回类型是Object. Error 1 Cannot implicitly convert type ‘object’ to ‘cs_sandbox.Foo’. An expl
我有一个工厂应该创建在运行时从类Foo继承的对象.我认为System.Activator.CreateInstance的返回类型与它创建的对象的类型相同,但从以下错误消息判断,其返回类型是Object.

Error 1 Cannot implicitly convert type ‘object’ to ‘cs_sandbox.Foo’. An explicit conversion exists (are you missing a cast?) F:projectscs_sandboxForm1.cs 46 24 cs_sandbox

好吧,也许我错过了一个演员,但是

return (t)System.Activator.CreateInstance(t);

导致又一条错误信息 – 我必须承认 – 这对我没有意义:

Error 1 The type or namespace name ‘t’ could not be found (are you missing a using directive or an assembly reference?) F:projectscs_sandboxForm1.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);
        }
    }
}

我该如何修复此代码?或者,如果它不可修复,那么在运行时创建从特定类继承的对象的其他方法是什么?

解决方法

您需要将返回的对象强制转换为Foo类型.将它强制转换为变量中定义的类型是没有意义的.它应该由编译器知道,因为通过继承层次结构的整个点是满足编译器的静态类型检查.

return (Foo)System.Activator.CreateInstance(t);

有一个通用版本,System.Activator.CreateInstance< T>,它创建一个已知类型(不是类型变量,但是类型参数或静态已知类型,在后一种情况下,它没有太大意义):

return System.Activator.CreateInstance<FooChild1>();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读