1

複数の新機能を持つ Windows フォームのようなクラスを作成しようとしています。これは単純に の「より良い」バージョンにFormなり、この正確なプログラムでの作業がより簡単になります。これが私がこれまでに持っているものです:

public class SuperForm : Form
{
    protected abstract void OnSizeChanged(object sender, EventArgs e);

    public SuperForm()
    {
        this.SizeChanged += OnSizeChanged;
    }
}

OnSizeChangedサイズが変更されたときに自動的に呼び出されるものをすべてのフォームが定義する必要があることを確認するだけですが、それ以上のものがあります。

次に必要なのは、クラス/タイプをパラメーターとして取り、そのタイプの新しいオブジェクトを初期化し、自動的に追加してからControlsオブジェクトを返すメソッドです。これがどのようになりたいかについてのコード例です(動作していません):

public cls NewControl(ClassType cls) // This obviously doesn't work.
// I need it to return an object of type "cls" parameter.
{
    cls newControl = new cls();
    this.Controls.Add(newControl);
    return newControl;
}

ClassTypeが有効なタイプではないことはわかっているため、助けが必要です。

そして、基本的に次のように呼び出すことができます。

Button b = this.NewControl(Button);

これは新しいボタンを返し、それを に追加しthis.Controlsます。コントロールを初期化するときに、最終的にはこれらの一般的なタスクをさらに実行する必要があるかもしれないので、それを独自のメソッドに入れたいと思います。

これはC#で可能ですか? そうでない場合、回避策はありますか?Control1 つの方法は、次のように継承する各クラスのメソッドを定義することです。

public Button NewControl(Button b);
public TextBox NewControl(TextBox tb);
public ListBox NewControl(ListBox lb);

しかし、それは私にとって有効な選択肢のようには思えません。

4

1 に答える 1

5

型パラメーターにいくつかの制約を付けて、ジェネリック メソッドを作成したいようです。

public T CreateAndAdd<T>() where T : Control, new()
{
    T newControl = new T();
    Controls.Add(newControl);
    return newControl;
}

ここで、T : Control制約により、コントロールを作成していることを確認して、 を使用できるようにしますControls.Add。このT : new()制約により、型引数にパラメーターなしのパブリック コンストラクターが含まれていることが保証されるため、 を呼び出すことができますnew T()

たとえば、TextBox を作成するには、次のように関数を呼び出します。

var tb = CreateAndAdd<TextBox>()

(私は明快であると信じている方法の名前を変更しました。)

于 2013-01-31T14:40:57.843 に答える