【问题标题】:Define interface for loading custom UserControls through reflection定义通过反射加载自定义用户控件的接口
【发布时间】:2010-05-18 13:01:34
【问题描述】:

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

public interface IStartEnd
{
    void Start();
    void End();
}

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

    public void End()
    { }
}

我想要一个通过反射加载的接口,但是以下显然不能工作,因为接口不能继承一个类:

public interface IMyUserControls : UserControl, IInit, IDispose
{

}

【问题讨论】:

    标签: c# inheritance user-controls interface


    【解决方案1】:

    我没有看到用例,通过反射加载用户控件需要知道控件的类型名称。如果您自己动态加载程序集,请使用 Assembly.CreateInstance,或者使用带有 Activator.CreateInstance 的完整类型名称,以便 CLR 可以确定需要加载的程序集。

    如果您想避免指定用户控件类型名称,则可以使用 Assembly.GetTypes() 迭代加载的程序集并查找实现您的接口的类型。这只有在您能以某种方式保证程序集仅包含一个控件时才能正常工作。

    【讨论】:

    • 为什么你认为程序集应该只有 1 个用户控件?
    • 因为否则你会发现不止一个实现接口的控件。你会选择哪一个?
    • 看看我下面的回答:stackoverflow.com/questions/2857448/…
    【解决方案2】:

    您可以在运行时强制执行约束,即实现IMyUserControls : IInit, IDispose 的类也可以执行is UserControl。可以合理地假设为您的应用提供自定义控件的开发人员知道控件的要求,因此我认为在运行时执行检查没有问题。

    【讨论】:

      【解决方案3】:

      听起来您正在尝试做的事情与 Prism(和复合应用程序块)采用的方法非常相似。阅读以下文章,让您了解所涉及的内容:

      那里有大量示例,并且这种模式被广泛使用。

      我希望这会有所帮助。

      B

      【讨论】:

        猜你喜欢
        • 2021-02-12
        • 1970-01-01
        • 2016-08-15
        • 1970-01-01
        • 1970-01-01
        • 2015-11-02
        • 1970-01-01
        • 2011-03-14
        • 1970-01-01
        相关资源
        最近更新 更多