我有一个有很多后代的基类。在基类中,声明了无参数构造函数。后代可以声明专门的构造函数。
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这样做?
答案 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;
}
}