C# WinRT可以使用反射来查找和调用超类构造函数吗?

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子类型。我想既然基类有构造函数,我就可以像这样

我有以下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
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#和我分开的时间太长了。就反射而言,我知道其中的陷阱,但这些类是为序列化和通过套接字传输而设计的,所以就我所知,没有另一种直接显而易见的方法来实现。谢谢你的建议!