我编写了ASP.NET页面来管理表单.它们基于以下基类.
public abstract class FormPageBase<TInterface, TModel> : Page, IKeywordProvider
where TModel:ActiveRecordBase<MasterForm>, TInterface, new()
where TInterface:IMasterForm
{
public TInterface FormData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
一个示例SubClass在这里:
public partial class PersonalDataFormPage : FormPageBase<IPersonalDataForm, PersonalDataForm>, IHasFormData<IPersonalDataForm>, IHasContact
{
}
Run Code Online (Sandbox Code Playgroud)
下面我在页面上有一个usercontrol,我想从页面"使用""FormData",以便它可以读/写它.
然后,我有一个更"通用"的用户控件,我想在我所有的表单子类的基接口上操作... IMasterForm
但是当usercontrol尝试强制转换Page.FormData时(尝试将页面强制转换为IHasFormData<IMasterForm>它)告诉我该页面IHasFormData<IFormSubclass>即使我对IFormSubclass有一个约束,它说它也是IMasterForm
无论如何,我可以从通用子类转换为通用超类,还是这个"协方差"和C#4.0的东西?
public abstract class FormControlBase<T> : UserControl, IKeywordProvider
where T:IMasterForm
{
protected T FormData { get; set; }
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
//This cast is failing when my common control's T does not …Run Code Online (Sandbox Code Playgroud)