0

継承されたユーザーコントロールを検出するための簡単な方法がわからないため、ここでは少し湿地に陥っています。基本的に、私はユーザーコントロール「UC」を持っています、

public partial class UC : UserControl 

これは、一般的なプロパティの一種のテンプレートとして機能します。

およびいくつかの継承されたユーザーコントロール( "uc1"、 "uc2"、 "uc3"など...)

public partial class uc1 : UC

*目的は、継承されたコントロールを一覧表示し、初期化時にコンテナパネルにそれらをスローすることです。

私の質問:それらを検出/カウント/リストするのは簡単な方法(20行以上のコードはありません)ですか、それともまったく実行できますか?

アドバイスをいただければ幸いです。

開発者のトレーニング:D

4

3 に答える 3

1

このようなことを試してください (これは、まだロードされていないアセンブリではなく、既存のすべてのアセンブリをトラバースします。また、実際に何をする必要があるかをより意識して、これよりもエレガントなことを行うことをお勧めします。これは単なる力ずくです。 (時間とリソースもかかるため、ミリ秒ごとに 1 回ではなく、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;
}

ただし、ここで論理的な欠陥に注意してください。クラスを拡張する各クラスには、UC1 つのインスタンスと 1 つのインスタンスしかありません。また、内部でこれらのユーザー コントロールの配置をどのように動的に管理しますthePanelか?

于 2013-03-01T10:20:20.783 に答える
0

これらのコントロールが配置されている場所(つまり、アセンブリ)がわかっている場合は、useを使用Reflectionしてオブジェクトを反復処理し、タイプをテストできます。結果のコードが20行以下のコードになるかどうかはわかりませんが、それが私が知っている唯一の方法です...

于 2013-03-01T10:15:35.497 に答える
0

基本クラスに静的カウンターを追加します。基本クラスの共通コンストラクター、またはinitメソッドで-counter++を呼び出します。そして、その閉じられたイベントコールカウンターで-。

数行のコードを書くことに不安がない場合は、カウンターを保持するためのシングルオンパターンよりも優れています。

于 2013-03-01T10:29:44.820 に答える