C# 抽象类-->;获取当前派生类的新实例

C# 抽象类-->;获取当前派生类的新实例,c#,abstract-class,derived-class,C#,Abstract Class,Derived Class,是否可以获取当前派生类的新实例,该派生类正在调用基抽象类的函数?例如: class Bar1 : Foo { } class Bar2 : Foo { } abstract class Foo { public Foo CreateAnotherInstance() { return new Bar1/Bar2(); // depending on the calling derived class } } 应导致: Bar1 bar1 = n

是否可以获取当前派生类的新实例,该派生类正在调用基抽象类的函数?例如:

class Bar1 : Foo
{

}
class Bar2 : Foo
{

}

abstract class Foo
{
    public Foo CreateAnotherInstance()
    {
        return new Bar1/Bar2();   // depending on the calling derived class
    }
}
应导致:

Bar1 bar1 = new Bar1();
Bar2 bar2 = new Bar2();
Foo bar1_2 = bar1.CreateAnotherInstance();  // Should be a new Bar1 instance
Foo bar2_2 = bar1.CreateAnotherInstance();  // Should be a new Bar2 instance
我发现创建实例的唯一方法是使用抽象方法,在每个派生类中创建实例,如:

class Bar1 : Foo
{
    public override Foo CreateAnotherInstance()
    {
        return new Bar1();
    }
}

class Bar2 : Foo
{
    public override Foo CreateAnotherInstance()
    {
        return new Bar2();
    }
}

abstract class Foo
{
    public abstract Foo CreateAnotherInstance();
}
但是通过这种方式,我必须为每个派生类创建方法


这个问题有没有更简单的解决方案?

感谢RenéVogt和mjwills给出的答案:

使用

因此,将抽象类更改为:

abstract class Foo
{
    public Foo CreateAnotherInstance()
    {
        return (Foo)Activator.CreateInstance(GetType());
    }
}
如果构造函数不是无参数的:

(Foo)Activator.CreateInstance(GetType(), para1, para2, ...); 

虽然
Activator.CreateInstance
是一种很好的方法,但我不确定这是属于基本抽象类的方法,或者确实是属于这些类中的任何一个。这不是打破了吗?或者至少是Liskov替代原理

在任何情况下,作为一种替代方案,创建一个适用于任何类型的简单方法如何,而不仅仅是上述类型。e、 g

public static T CreateNew<T>(params object[] parms)
{
  return (T) Activator.CreateInstance(typeof(T), parms);
}
publicstatict CreateNew(params对象[]parms)
{
return(T)Activator.CreateInstance(typeof(T),parms);
}

这还允许您传入构造函数参数(如果有)。

为什么需要它
bar1
已经是
bar1
返回激活器.CreateInstance(GetType())的实例将起作用。是的,请参阅mjwills的链接或@Pedro。您应该将解决方案添加为自我回答,而不是在原始帖子中。
public static T CreateNew<T>(params object[] parms)
{
  return (T) Activator.CreateInstance(typeof(T), parms);
}