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

Man*_*aux 1 .net c# reflection module

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

public abstract class Module
{
    public abstract Type ConfigurationForm { get; }
}
Run Code Online (Sandbox Code Playgroud)

在显示配置表单时,我只是实例化一个这种类型的Form并调用该Show()方法.

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

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

cor*_*erm 6

您可以使用泛型类型参数来完成此操作

public abstract class Module<F> where F : Form
{
    public Type ConfigurationForm { get { return typeof(F); } }
}
Run Code Online (Sandbox Code Playgroud)

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

public abstract class Module
{
    public abstract Form CreateConfigurationForm();
}
Run Code Online (Sandbox Code Playgroud)

编辑:使用第二个选项的优点是您可以编写代码来使用Module类,而无需具体了解您正在处理哪种模块