0

我在这里陷入了困境,因为我无法找到一种足够简单的方法来检测继承的用户控件。基本上,我有一个用户控件“UC”,

public partial class UC : UserControl 

它将作为通用属性的一种模板;

和一些继承的用户控件(“uc1”、“uc2”、“uc3”等...)

public partial class uc1 : UC

*目的是列出继承的控件并在初始化时将它们扔到容器面板中。

我的问题:我可以检测/计数/列出它们是一些简单的方法(没有 20 多行代码的东西)还是可以完成?

任何建议表示赞赏。

开发人员培训 :D

4

3 回答 3

1

尝试这样的事情(这将遍历所有现有的程序集,而不是尚未加载的程序集。我还建议做一些比这更优雅的事情,这涉及到更多地了解你实际需要做什么。这只是蛮力(而且它也需要时间和资源,所以只运行一次,而不是每毫秒一次)):

var query = from assembly in AppDomain.CurrentDomain.GetAssemblies()
            from type in assembly.GetTypes()
            where typeof(UC).IsAssignableFrom(type) && (type != typeof(UC))
            let ctor = type.GetConstructor(Type.EmptyTypes)
            where ctor != null
            select type;

foreach (var type in query) {                
    var control = Activator.CreateInstance(type, nonPublic: true) as UC;
    control.Parent = thePanel;
}

但要注意这里的逻辑缺陷:扩展该类的每个类UC都将有 1 个实例和仅 1 个实例。另外:您将如何动态管理这些用户控件在内部的定位thePanel

于 2013-03-01T10:20:20.783 回答
0

如果您知道这些控件的位置(我的意思是程序集),您可以使用 useReflection来遍历对象并测试类型。不确定生成的代码是否会是 20 行或更少的代码,但这是我知道的唯一方法......

于 2013-03-01T10:15:35.497 回答
0

向基类添加一个静态计数器。在基类公共构造函数或 init 方法中 - 调用 counter++ 。并在其关闭的事件呼叫计数器上-。

如果你不害怕多写几行代码,那么用单模式来保存计数器会更好。

于 2013-03-01T10:29:44.820 回答