C# WinRT可以使用反射来查找和调用超类构造函数吗?
我有以下Windows运行时解决方案设置: 在由我的EXE引用的DLL中C# WinRT可以使用反射来查找和调用超类构造函数吗?,c#,windows-runtime,C#,Windows Runtime,我有以下Windows运行时解决方案设置: 在由我的EXE引用的DLL中 public abstract class BaseClass { public BaseClass(Guid id, string name) { //... } } 在EXE中 public sealed class DerivedClass : BaseClass { } 在DLL中,还有另一个类使用运行时指定的BaseClass子类型。我想既然基类有构造函数,我就可以像这样
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
的GetConstructor()
方法,但在WinRT中似乎没有。有一个DeclaredConstructors
属性,但它只列出在DerivedClass
中显式声明的构造函数DerivedClass
对于这个特定的构造函数,除了BaseClass
之外,不需要做任何事情,所以我不想只写一个调用base
的显式构造函数,但是如果这是唯一的选项,那么请告诉我(我确认这种方法是有效的) 在C#超类构造函数中,派生类不会自动继承类。假设您有一个带构造函数的超类:
public class BaseClass
{
public BaseClass(Guid id, string name)
{
//...
}
}
如果不在派生类上声明具有相同参数集的构造函数,则该构造函数将不可用。您需要从派生类构造函数调用超级类构造函数以使其可用:
public sealed class DerivedClass : BaseClass
{
public DerivedClass(Guid id, string name)
: base(id, name)
{ }
}
此外,派生类构造函数始终需要调用超级类构造函数。如果您有一个无参数的超类构造函数,则不需要显式调用它,因为它将被自动调用。但是请记住,隐式地调用无参数构造函数,而不是具有匹配参数的构造函数。在所有其他情况下,您需要使用上述语法显式调用所选的超类构造函数
另一点值得一提的是,抽象类并不真正需要公共构造函数,因为它们只能从派生类调用,因为抽象类不能直接实例化。这意味着您真的应该让它们受到保护。编译器不会抱怨,但如果抽象类上有公共构造函数,大多数样式检查工具都会发出警告
最后一件事:你真的应该避免使用反射,除非它是绝对必要的。它会影响性能,也会破坏类型安全性,也就是说,在运行时而不是编译时会出现错误。哦,对了,我只是不小心将构造函数键入了public(在阅读了Activator只选择public构造函数之后,我想到了public)。我没有意识到C#没有隐式继承它的超类构造函数,我猜C#和我分开的时间太长了。就反射而言,我知道其中的陷阱,但这些类是为序列化和通过套接字传输而设计的,所以就我所知,没有另一种直接显而易见的方法来实现。谢谢你的建议!