2

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

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(在我的示例中)的构造函数并使用它来实例化d1可能发生的任何类型的另一个实例而无需链来实现这一点?

4

2 回答 2

9
d2 = (Base)Activator.CreateInstance(d1.GetType());
于 2013-08-08T13:37:58.990 回答
1

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

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();

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

于 2013-08-08T13:41:16.770 回答