首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Activator.CreateInstance()故障

Activator.CreateInstance()故障
EN

Stack Overflow用户
提问于 2009-09-27 21:50:45
回答 4查看 16.7K关注 0票数 3

我有一个工厂,它应该创建在运行时继承类Foo的对象。我认为System.Activator.CreateInstance的返回类型与它正在创建的对象的类型相同,但是从下面的错误消息来看,它的返回类型是Object。

错误1不能隐式地将类型'object‘转换为'cs_sandbox.Foo’。存在显式转换(是否缺少强制转换?)F:\projects\cs_sandbox\Form1.cs 46 24 cs_sandbox

好吧,也许我错过了演员阵容,但是

代码语言:javascript
复制
return (t)System.Activator.CreateInstance(t);

结果产生了另一条错误信息--我必须承认--对我来说是毫无意义的:

错误1无法找到类型或命名空间名称“t”(您是缺少了使用指令还是程序集引用?)F:\projects\cs_sandbox\Form1.cs 45 25 cs_sandbox

这是我的密码:

代码语言:javascript
复制
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);
        }
    }
}

我怎样才能修正这段代码?或者,如果它是不可修复的,那么在运行时创建从特定类继承的对象的其他方法是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-27 21:53:36

您需要将返回的对象转换为Foo类型。将其转换为在变量中定义的类型是没有意义的。编译器应该知道这一点,因为通过继承层次结构转换的全部内容都满足编译器的静态类型检查。

代码语言:javascript
复制
return (Foo)System.Activator.CreateInstance(t);

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

代码语言:javascript
复制
return System.Activator.CreateInstance<FooChild1>();
票数 10
EN

Stack Overflow用户

发布于 2012-10-15 09:51:00

激活后,我不得不使用UnWrap()方法,就像MSDN中描述的那样:

代码语言:javascript
复制
// 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。此外,我还必须使用这样的参数:

代码语言:javascript
复制
    ObjectHandle obj = domain.CreateInstance("Other.Assembly.Name", "Full.Class.Namespace.ClassName");
票数 2
EN

Stack Overflow用户

发布于 2009-09-27 22:12:46

我觉得你应该这么做:

代码语言:javascript
复制
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来创建一个类型,所以您最好只是更新它们,而不是激活它们。

这对你有意义吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1484577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档