如何在静态基方法中创建inheritance实例?

从一个实例中,我可能会这样做。

var obj= Activator.CreateInstance(GetType()); 

不知道如何在静态基方法中获取inheritance类的typeof。

这是前进的最佳方式吗?

  public static Method() where T : SomeBase, new() 

没有衍生的静态方法。 因此,无法创建一个静态工厂方法,该方法根据您调用它的派生类返回不同的类型。

正如Lonli-Lokli建议的那样,您应该使用抽象工厂设计模式 。

 public interface ISomething { void DoSomething(); } public class SomeClass : ISomething { public virtual void DoSomething() { Console.WriteLine("SomeClass"); } } public class SomeDerivedClass : SomeClass { private int parameter; public SomeDerivedClass(int parameter) { this.parameter = parameter; } public virtual void DoSomething() { Console.WriteLine("SomeDerivedClass - {0}", parameter); base.DoSomething(); } } public interface IFactory { public ISomething Create(); } public class SomeClassFactory : IFactory { public ISomething Create() { return new SomeClass(); } } public class SomeDerivedClassFactory : IFactory { public ISomething Create() { return new SomeDerivedClass(SomeParam); } public int SomeParam { get; set; } } 

抽象工厂与静态工厂方法的优点

  • 它更加灵活,允许为抽象工厂的每个实现者实现工厂逻辑的新实现(可能会如您所希望的那样复杂)。 如果你愿意,你可以为每个class级设置多个工厂。
  • 由于您没有调用静态方法,因此在运行时更容易更换。 这对于在unit testing中注入模拟非常有用。

专业人士是巨大的。 抽象工厂在各方面都优于静态工厂方法,即使您可以按照您希望的方式使用静态方法。

抽象工厂与静态工厂方法的缺点

  • 抽象工厂的用户必须具有工厂实例才能创建派生类型。
  • 您必须为每个派生类编写一个新的抽象工厂实现。

缺点很少。

用户可以非常轻松地实例化工厂以创建单个对象:

 MyClass myClass = new MyClassFactory().Create(); 

至于工厂实现中的代码重复:保存实现者一点点打字是没有意义的。 编程中的目标是编写可以读取,理解和轻松修改的代码。 节省纸张或按键没有编程目标:)

您可以使基类通用并在派生类中关闭generics。

 public abstract class CreatorOf where T : CreatorOf { public static T Create() { return (T)Activator.CreateInstance(typeof(T)); } } public class Inheritor : CreatorOf { public Inheritor() { } } public class Client { public Client() { var obj = Inheritor.Create(); } } 

有些人认为这是一种“反模式” ,但我相信在某些情况下这是一种可接受的方法。

也许你应该更好地尝试使用抽象工厂模式? http://en.wikipedia.org/wiki/Abstract_factory_pattern