Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将类型变量的值强制为特殊基类型_C#_.net_Reflection_Module - Fatal编程技术网

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

C# 将类型变量的值强制为特殊基类型,c#,.net,reflection,module,C#,.net,Reflection,Module,我通过强制模块实现一个抽象类来实现我的模块系统,该抽象类包含基础应用程序将调用的强制方法。现在我想为每个模块实现一个配置表单。我考虑将表单类型作为模块骨架类的属性返回: public abstract class Module { public abstract Type ConfigurationForm { get; } } 显示配置表单时,我只需实例化这种类型的表单并调用Show()方法 问题是,我想强制模块返回一个类型,该类型是System.Windows.Forms.Form

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

public abstract class Module
{
    public abstract Type ConfigurationForm { get; }
}
显示配置表单时,我只需实例化这种类型的表单并调用
Show()
方法

问题是,我想强制模块返回一个类型,该类型是
System.Windows.Forms.Form
的子类,否则调用将失败。实施这一点的正确方法是什么


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

您可以使用泛型类型参数来实现这一点

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

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

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

编辑:使用第二个选项的优点是,您可以编写代码来处理模块类,而无需具体知道您要处理的是哪种类型的模块

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

public abstract Form CreateConfigurationForm();
或工厂方法(或工厂类):

公共抽象函数ConfigurationFormCreator();

另一种选择是使用泛型,正如erash所建议的。

没有办法限制函数返回
类型,它表示从
表单继承的类型。您可以做什么来直接返回表单:

public abstract Form CreateConfigurationForm();
或工厂方法(或工厂类):

公共抽象函数ConfigurationFormCreator();

另一种选择是使用泛型,正如erash所建议的。

是否有任何原因导致
ConfigurationForm
属性不能使用
表单的返回类型
?配置表单的类型因模块而异,因为它是从
表单
继承的。或者您的意思是我应该在模块代码中实例化表单本身吗?
ConfigurationForm
属性是否有任何原因不能使用
form
的返回类型?配置表单的类型因模块而异,因为它继承自
form
。或者你的意思是我应该在模块代码中实例化表单本身吗?是的,当然!不知道为什么我想在模块外创建表单的实例。。。谢谢你!是的,当然!不知道为什么我想在模块外创建表单的实例。。。谢谢你!