将Type变量的值强制为特殊基类型

时间:2011-05-29 16:51:15

标签: c# .net reflection module

我通过强制模块实现一个抽象类来实现我的模块系统,该抽象类包含将由基础应用程序调用的强制方法。现在我想实现每个模块的配置表单。我想过将表单的类型作为模块骨架类的属性返回:

public abstract class Module
{
    public abstract Type ConfigurationForm { get; }
}

显示配置表单时,我只是实例化此类型的表单并调用Show()方法。

问题是,我想强制模块返回一个类型,它是System.Windows.Forms.Form的子类,否则调用会失败。执行此操作的正确方法是什么?

我想过将ConfigurationForm属性封装在另一个属性中,该属性检查它是否继承自Form,但我不认为这是一种干净的方法来实现这一点。

2 个答案:

答案 0 :(得分:6)

您可以使用泛型类型参数

来完成此操作
public abstract class Module<F> where F : Form
{
    public Type ConfigurationForm { get { return typeof(F); } }
}

但实际上这可能更有意义:

public abstract class Module
{
    public abstract Form CreateConfigurationForm();
}

编辑:使用第二个选项的优点是你可以编写代码来使用你的Module类,而不必具体知道你正在处理哪种模块

答案 1 :(得分:1)

无法限制函数返回Type,它表示继承自Form的类型。您可以做什么直接返回表单:

public abstract Form CreateConfigurationForm();

或工厂方法(或工厂类):

public abstract Func<Form> ConfigurationFormCreator();

另一种选择是使用泛型,就像时代所暗示的那样。