如何解决在使用IoC时如何通过接口扩展UserControl
使用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不同的接口。如果您将其统一,一切都会按预期进行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。