问题描述
使用C#,我们正在使用Shell窗体使用的自定义用户控件。所有自定义用户控件都允许用户执行一些基本功能,例如:
Save() ValidateItem()
我们的用户控件扩展了一个名为ScopedUserControl的类。
public class ScopedUserControl : UserControl,IScopedControl
{
private ILifetimeScope _scope;
public void SetLifetimeScope(ILifetimeScope scope)
{
_scope = scope;
}
#region Idisposable override
private bool disposed = false;
protected override void dispose(bool disposing)
{
base.dispose(disposing);
if (!disposed)
{
if (disposing)
{
_scope?.dispose();
}
disposed = true;
}
}
#endregion
}
这里有一个接口,可与AutoFac IoC一起使用。
public interface IScopedControl : Idisposable
{
void SetLifetimeScope(ILifetimeScope scope);
}
我想做的是让一个通用的shell形式消耗一个用户控件。该用户控件将实现一个名为IEditBase的接口
public partial class ucDataGrid : ScopedUserControl,IEditBase
{
...
这是IEditBase
public interface IEditBase
{
bool ValidateItem();
bool Save();
}
现在,当用户单击表单外壳中的工具栏保存按钮时:
public partial class frmEditShell : ScopedForm
{
....
private void tsbSave_Click(object sender,EventArgs e)
{
((IEditBase)pnlControls.Controls[0]).Save();
this.Close();
}
我收到此错误: system.invalidCastException:'无法将类型为'View.ucDataGrid'的对象转换为类型为'Interface.IEditBase'。在这一行:
((IEditBase)pnlControls.Controls[0]).Save();
由于扩展类ScopedUserControl中的Interface,我认为我无法转换它。
我认为我的设计方法可能有缺陷,或者我错过了一些东西。感谢您的帮助。
M。
解决方法
您有2个接口,它们的名称分别为:IEditBase,位于不同的命名空间中:) ucForecastWeightedEdit实际上继承了与ucServiceItemOnLocation不同的接口。如果您将其统一,一切都会按预期进行。