1

私は、数十の他のクラスを派生させるために使用される抽象クラスを持っています。各クラスは似ていますが、わずかに異なることを行います。これらのクラスは Reflection によってロードされ、実行する必要があるクラスを選択するためにユーザーに公開されます。

これが機能するのは、基本クラスに、各派生クラスによってオーバーライドされる Run という抽象メソッドがあるためです。したがって、これらの型の変数が必要なコード内のあらゆる場所で、それらを基本クラスとして宣言します。次に、Run メソッドを呼び出すと、実際の型からメソッドが実行されます (基本クラスとして宣言したにもかかわらず)。

私の問題は、これらの派生クラスごとにカスタマイズされた UI を表示する必要があることです。それぞれにカスタム UserControl を作成することを考えました。これらのコントロールには、ユーザーが行ったことに基づいて値を返すパブリック メソッドがあります。次に、実行時にこのコントロールを作成し、ユーザーが必要なものを設定し、このコントロールから return メソッドを呼び出します。最終的に、ユーザーが選択したクラスの Run Run メソッドに i を渡して実行します。

ユーザーはその基本クラスから派生した dll を作成し、それをプラグインとしてアタッチできるため、自分が持っている派生クラスの数や種類がわかりません。

このため、これらのカスタム コントロールをフォーム上にジェネリック UserControl クラスとして作成し、実際の型としてキャストする必要があると思います。しかし、コントロールが UserControl から派生したものであることだけを知る方法はありますか?

基本クラスにパブリック プロパティを作成してそのカスタム コントロールを格納することはできますが、メイン コードに戻ると、汎用ユーザー コントロールをこのプロパティに格納されている型としてキャストできますか?

また、ここで設計上の問題はありますか?それを行うために別のアプローチを使用できますか?

私はそれが非常に混乱しないように聞こえることを願っています:(

4

3 に答える 3

3

誤解されているかもしれませんが、私は次のように考えています。

public abstract class BaseClass<T> where T: UserControl, IMyControl
{
    private Page _page;
    protected T Control { get; private set;}

    public BaseClass(Page page, string controlPath)
    {
        _page = page;
        Control = (T)page.LoadControl(controlPath);
        _page.Controls.Add(Control);
    }

    public void Run()
    {
        var data = Control.GetData();
    }
}

public interface IMyControl
{
    object GetData();
}
于 2012-04-26T19:27:02.413 に答える
1

UserControl を継承するクラスを作成します。Abstract にすることはできないと思いますが、CreateControl() という別の型で、UI を含む必要がある UserControl のインスタンスを返すメソッドを作成できます。

次に、特定の UserControl が何であるかを実際に気にせずに、その UserControl を Panel またはその他のコンテナーに追加できます。Save や Load など、その UserControl に実装したい特定のメソッドがある場合は、それらを UserControl から派生する Base クラスに仮想メソッドとして追加できます。

于 2012-04-26T19:33:54.017 に答える
0

これが正しい解決策か最善の解決策かはわかりませんが、上記の回答といくつかの調査に基づいて、次のように問題を解決しました。

BaseClass から派生した各クラスには、オーバーライド可能なメソッド GetControl があります。このメソッドは、クラス専用に設計された UserControl の新しいインスタンスを返します。

ユーザーが派生クラスを選択したら、GetControl メソッドを呼び出し、このコントロールをフォームに追加します。次に、クラス用に設計された UI が表示されます。このコントロールは、別のクラスが選択された場合に削除され、新しい UI がこの別のクラス用に作成されます。

ユーザーがコントロールで行った設定を読み取るために、各 UserControl に ReadData というメソッドを実装しました。オブジェクト レベルからこのメソッドを呼び出すには、リフレクションを使用しました。

Object ui = FindControlByName("SelectedClassUI");
Type t = ui.GetType();
MethodInfo m = t.GetMethod("ReadData");
Object userSetup = m.Invoke(ui, null);

<... do something with userSetup ...>
于 2012-05-07T13:50:10.787 に答える