C#泛型、抽象类和有界通配符
在C#中使用泛型时,我有一个小问题: 我有以下课程:C#泛型、抽象类和有界通配符,c#,generics,C#,Generics,在C#中使用泛型时,我有一个小问题: 我有以下课程: public abstract class OphControl<TDataModel> : Control where TDataModel : OphDataModel, new() { /// <summary> /// The data model for this control. /// </summary> public TDataModel Data
public abstract class OphControl<TDataModel> : Control
where TDataModel : OphDataModel, new()
{
/// <summary>
/// The data model for this control.
/// </summary>
public TDataModel DataModel { get; private set; }
public IEnumerable<OphControl<OphDataModel>> OphControls {
get {
return Controls.Cast<Control>().Where(control => control is OphControl<OphDataModel>).Cast<OphControl<OphDataModel>>();
}
}
protected OphControl() {
DataModel = new TDataModel();
}
}
公共抽象类控件:控件
其中TDataModel:OphDataModel,new()
{
///
///此控件的数据模型。
///
公共TDataModel数据模型{get;private set;}
公共IEnumerable控件{
得到{
返回Controls.Cast()。其中(control=>control是OphControl.Cast();
}
}
受保护的控制(){
DataModel=新的TDataModel();
}
}
我的问题是,OphControls
属性不会编译,因为OphDataModel
是抽象的,因此我假设在编译时无法确定OphDataModel是否具有零参数公共构造函数(请注意TDataModel
上的new()
约束)
我甚至不确定这样做是否正确。我真正想要的是类似于
OphControl的东西,您只需要更改OphControls
上的通用参数:
public IEnumerable<OphControl<TDataModel>> OphControls {
get {
return Controls.Cast<Control>().Where(control => control is OphControl<TDataModel>).Cast<OphControl<TDataModel>>();
}
}
公共IEnumerable控件{
得到{
返回Controls.Cast()。其中(control=>control是OphControl.Cast();
}
}
这应该是可以编译的,但是如果不了解更多关于类的信息,很难说这是否正确。首先,OphControl
不是从OphControl
派生出来的,您对out
关键字(协方差/逆变)的理解是正确的,它们只能用于委托和接口。因为它不是基类,所以您可能无法强制转换它
与java不同,c#不支持通用通配符(…您得到的确切错误是什么?非常确定它与新建控件的声明在哪里无关?@JaredPar'WinformToolkit.DataModels.OphDataModel'必须是带有公共无参数构造函数的非抽象类型,才能将其用作泛型类型或方法“WinformToolk”中的参数“TDataModel”it.OphControl'@ivowiblo这是Control
的标准属性。您得到的编译错误是什么?它看起来应该可以正常工作;感谢您的回答-但我认为这不对…OphControls将返回从OphControl子类化的所有子控件的枚举-它们不会共享相同的数据模型类型。
public abstract class OphControl : Control { ... }
public abstract class OphControl<TDataModel> : OphControl
where TDataModel : OphDataModel, new() { ... }
public IEnumerable<OphControl> OphControls {
get {
return Controls.OfType<OphControl>();
}
}