使用Activator创建Class的实例,在基类中使用无参数构造函数

时间:2015-03-26 15:03:26

标签: c#

我有一个有很多后代的基类。在基类中,声明了无参数构造函数。后代可以声明专门的构造函数。

public class A 
{
   public A()
   {
   }
}

public class B : A
{
  string Stuff { get; set; }
  public B(string stuff)
  {
    Stuff = stuff;
  }
}

在某些时候,我想使用Activator实例化B。这个实例不需要初始化它的“Stuff”。所以我想使用A的默认构造函数:

public object InstantiateType(Type type)
{
   return Activator.CreateInstance(
      type,
      BindingFlags.CreateInstance |
      BindingFlags.Public |
      BindingFlags.NonPublic
   );
}

此示例调用导致异常,因为此主题的许多其他变体,它是否可能,如果是这样,我如何指示Activator这样做?

2 个答案:

答案 0 :(得分:3)

  

在某些时候,我想使用... A的默认构造函数

来实例化B

你做不到。构造函数不是继承的,并且您可以使用B的无参数构造函数。您需要创建一个传递给基础构造函数的构造函数:

public class B : A
{
  string Stuff{get;set}
  public B(string stuff)
  {
    Stuff = stuff;
  }
  public B() : base()  // technically the ": base()" is redundant since A only has one constructor
  {
  }
}

您还可以将CreateInstance调用更改为传递null作为字符串参数。

答案 1 :(得分:1)

以下是针对您的解决方法:

public class A {
    ///<summary>Creates an instance of A, or of a subclass of A</summary>
    public static A Create<T>() where T : A {
        A result = (A)FormatterServices.GetUninitializedObject(typeof(T));
        result.defaultInit();
        return result;
    }

    public A() {
        defaultInit();
    }

    private void defaultInit() {
        // field assignments ...
        // default constructor code ...
    }
}

public class B : A {
    string Stuff { get; set; }
    public B(string stuff) {
        Stuff = stuff;
    }
}