在使用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不同的接口。如果您将其统一,一切都会按预期进行。