我有以下Windows运行时解决方案设置:
在我的EXE引用的DLL中
public abstract class BaseClass {
public BaseClass(Guid id, string name) {
//...
}
}
在EXE中
public sealed class DerivedClass : BaseClass {
}
在DLL中,还有另一个类使用在运行时指定的BaseClass
子类型。我认为既然基类有构造函数,我就可以像这样实例化它:
//this._userType holds the type of DerivedClass
BaseClass foo = (BaseClass)Activator.CreateInstance(this._userType, id, name);
然而,它告诉我无法找到构造函数。所以我去找了其他答案说我可以使用Type
的{{1}}方法,但这似乎并不存在于WinRT中。有一个GetConstructor()
属性,但只列出在DeclaredConstructors
中显式声明的构造函数。对于这个特定的构造函数,DerivedClass
除了DerivedClass
之外不需要做任何事情,所以我不想写出一个调用BaseClass
的显式构造函数,但如果这是唯一的选项,然后让我知道(我确认这种方法有效)。
答案 0 :(得分:2)
在C#超类构造函数中,派生类不会自动继承类。假设你有一个带有构造函数的超类:
public class BaseClass
{
public BaseClass(Guid id, string name)
{
//...
}
}
如果未在派生类上声明具有相同参数集的构造函数,则它将不可用。您需要从派生类构造函数中调用超类构造函数以使其可用:
public sealed class DerivedClass : BaseClass
{
public DerivedClass(Guid id, string name)
: base(id, name)
{ }
}
此外,派生类构造函数始终需要调用超类构造函数。如果你有一个无参数的超类构造函数,你不需要显式调用它,因为它会被自动调用。但请记住,隐式地,无参数构造函数将始终被调用,而不是具有匹配参数的构造函数。在所有其他情况下,您需要使用上面的语法显式调用所选的超类构造函数。
值得一提的另一点是抽象类并不真正需要公共构造函数,因为它们只能从派生类中调用,因为抽象类不能直接实例化。这意味着你真的应该让他们protected
。编译器不会抱怨,但如果你在抽象类上有公共构造函数,大多数样式检查工具都会发出警告。
最后一件事:除非绝对必要,否则你应该避免使用反射。它会影响性能并且还会破坏类型安全性,即您在运行时会在编译时遇到错误。