【问题标题】:Creating an instance of a class with the same type as an existing object创建与现有对象具有相同类型的类的实例
【发布时间】:2013-08-08 13:36:41
【问题描述】:

我想根据属于简单类型层次结构的另一个实例的类型实例化一个类的实例。

public abstract class Base
{
}

public class Derived1 : Base
{
}

public class Derived2 : Base
{
}

用下面的代码很容易做到

Base d1 = new Derived1();

Base d2;

if (d1 is Derived1)
{
    d2 = new Derived1();
}
else if (d1 is Derived2)
{
    d2 = new Derived2();
}

但是,是否有可能在没有if...else if... 链的情况下通过(例如)使用反射来获取d1 的构造函数(在我的示例中)并使用它来实例化任何类型的另一个实例@可能是987654325@?

【问题讨论】:

    标签: c# base-class


    【解决方案1】:
    d2 = (Base)Activator.CreateInstance(d1.GetType());
    

    【讨论】:

    • 我刚刚想通了,正准备回答或删除我的问题... :)
    【解决方案2】:

    您可以使用工厂方法设计模式:

    public abstract class Base
    {
        public abstract Base New();
    }
    
    public class Derived1 : Base
    {
        public override Base New()
        {
            return new Derived1();
        }
    }
    
    public class Derived2 : Base
    {
        public override Base New()
        {
            return new Derived2();
        }
    }
    

    然后:

    Base d1 = new Derived1();
    Base d2 = d1.New();
    

    比反射更努力,但也更便携和更快。

    【讨论】:

    • 我以前用过这个,但它似乎有很多(好吧,不是真的那么多......)不必要的代码。你说的便携是什么意思?您是否有任何指标来说明性能差异?
    • @RichardEv 我没有指标。但是我在我的机器上检查了这两个,差异存在,但可以忽略不计。也许对于没有任何编译器优化的更多类型和更复杂的环境,这种差异可能会增加。我有把握地假设,基于继承的代码比基于反射的代码更有效。
    猜你喜欢
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    相关资源
    最近更新 更多