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

时间:2013-08-09 03:46:13

标签: c# windows-runtime

我有以下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的显式构造函数,但如果这是唯一的选项,然后让我知道(我确认这种方法有效)。

1 个答案:

答案 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。编译器不会抱怨,但如果你在抽象类上有公共构造函数,大多数样式检查工具都会发出警告。

最后一件事:除非绝对必要,否则你应该避免使用反射。它会影响性能并且还会破坏类型安全性,即您在运行时会在编译时遇到错误。