代码之家  ›  专栏  ›  技术社区  ›  Tim

定义通过反射加载自定义用户控件的接口

  •  3
  • Tim  · 技术社区  · 15 年前

    我正在使用反射将自定义用户控件加载到表单中。 我希望我的所有用户控件都有一个“开始”和“结束”方法,因此它们都应该是:

    public interface IStartEnd
    {
        void Start();
        void End();
    }
    
    public class AnotherControl : UserControl, IStartEnd
    {            
        public void Start()
        { }
    
        public void End()
        { }
    }
    

    我希望通过反射加载一个接口,但下面显然不起作用,因为接口不能继承类:

    public interface IMyUserControls : UserControl, IInit, IDispose
    {
    
    }
    
    3 回复  |  直到 15 年前
        1
  •  0
  •   Dan Bryant    15 年前

    可以在运行时强制类实现 IMyUserControls : IInit, IDispose is UserControl . 假设为您的应用程序提供自定义控件的开发人员知道控件的需求是合理的,所以我认为在运行时执行检查没有问题。

        2
  •  1
  •   Hans Passant    15 年前

    我看不到用例,通过反射加载用户控件需要知道控件的类型名。如果您自己动态加载了程序集,请使用assembly.createInstance,或者将完整的类型名与activator.createInstance一起使用,以便clr可以确定需要加载什么程序集。

    如果希望避免指定用户控件类型名称,那么可以使用assembly.gettypes()迭代加载的程序集,并查找实现接口的类型。只有在某种程度上可以保证程序集只包含一个控件的情况下,这才会很好地工作。

        3
  •  0
  •   Burt    15 年前

    听起来您要做的工作与Prism(和复合应用程序块)采用的方法非常相似。阅读以下文章,了解相关内容:

    外面有很多例子,这种模式被广泛使用。

    我希望这有帮助。