3

次のインターフェイス宣言があります。

public interface IBasePresenter
{
    void Run();
    void ShowDialog<T, M>(T t, M m ) where T : UserControl where M : Form,      ISomeInterface<SomeType>;
}

ShowDialog() は基本的に、モーダル ダイアログ ボックスをユーザーに表示するメソッドです。「T」は親フォームで、M は表示する固有のダイアログです。Mは複数種類あります!したがって、一般的な方法を選択する理由です!

この方法を使用できると思われるいくつかの方法:

Presenter.ShowDialog(this, typeof(Form1)); // FigA

または

Presenter.ShowDialog(this, new Form1()); // FigB

図 A または B に基づいて、サンプルの ShowDialog() メソッドの実装はどのようになりますか?

私の質問は、ジェネリック パラメータ 'M' が ShowDialog() メソッドの実装内でどのようにインスタンス化されるかを理解しようとすることから生じています。

4

4 に答える 4

5

推測で:

m.Controls.Add(t);
m.ShowDialog();

ただし、率直に言って、このユーティリティメソッドが多くの有用性を追加するかどうかはわかりません。また、一般的ではない可能性もあります(void ShowDialog(Control t, Form m))。制約を使用すると、おそらくより便利になる可能性があり: new()ます。これにより、複数のフォームで同じコントロールインスタンスを使用するリスクも回避されます(違法)。しかし、私が言うように、率直に言って、この方法が重要な有用性を示すまで、私はこの方法を気にしませんでした。そして、それを維持した場合は、パラメーターの名前を変更して、よりわかりやすくします。M、m、T、tのどれもそれらが何を意味するのか教えてくれません。

于 2012-09-03T16:15:16.817 に答える
4

は、ではなく、であるFig Aため、この方法を使用することはできません。タイプの2番目のパラメーターを受け取るオーバーロードがない限り、コードはコンパイルされません。typeof(Form1)System.TypeFormSystem.Type

ジェネリックパラメーター「M」は、ShowDialog()メソッド実装内でどのようにインスタンス化されますか?

これは「インスタンス化」されたものではなく、「推測されたもの」です。インスタンスはすでに指定されています。コンパイラは呼び出しから型を推測します。

于 2012-09-03T16:16:52.817 に答える
2

次のようにジェネリック メソッド シグネチャを変更できます。

public void ShowDialog<T>() where T : Form, new() {
    using(var dialog = new T()){
        dialog.ShowDialog();
    }
}

そして呼び出し:

ShowDialog<MyCoolDialog>();

その結果、mtheod はフォームの新しいインスタンスを作成し (今回は推測しません ;))、それをモーダルな方法で表示します。

于 2012-09-03T16:18:57.963 に答える
0

以下は、インターフェイス メソッドのわずかに更新されたバージョンです。

    void ShowDialog<TParentForm, TDialogForm, TModel, TEntity>(TParentForm t, TDialogForm m, Action callback)
        where TParentForm : UserControl
        where TModel : class, IModel<TEntity>, new()
        where TDialogForm : Form, IEditableItem<TEntity>, new();

以前のバージョンでいくつかの仮定を行ったため、テストと改良の段階でメソッド シグネチャが変更されました。それはまだ私にとって多かれ少なかれ教育的な演習であるため、単純に簡単な方法を選択するのではなく、それをやってのける方法を知りたいと思っていました.

メソッドの実装例:

    public void ShowDialog<TParentForm, TDialogForm, TModel, TEntity>(TParentForm t, TDialogForm m, Action callback)
        where TParentForm : UserControl
        where TModel : class, IModel<TEntity>, new()
        where TDialogForm : Form, IEditableItem<TEntity>, new()
    {
        using (var dialogToShow = new TDialogForm())
        {
            dialogToShow.StartPosition = FormStartPosition.CenterScreen;
            dialogToShow.FormBorderStyle = FormBorderStyle.FixedSingle;
            dialogToShow.Model = new TModel();

            // 2. show the new user control/form to the user.
            var result = dialogToShow.ShowDialog(t);

            // 3. handle the dialog result returned and update the UI appropriately.
            if (result == DialogResult.OK)
            {
                // print status label.
                callback.Invoke();
            }
        }
    }

どこにも使用されていないように見えるため、「TDialogForm m」パラメータがまだそこにある理由は完全にはわかりません。

メソッドの使用方法:

    private void BtnAddNewServiceClick(object sender, EventArgs e)
    {            
        Presenter.ShowDialog<ServerRolesControl, AddNewServiceForm, ServiceModel, Role>(this, new AddNewServiceForm(), SetAddedRolesLabel);
    }

    private void BtnViewAllServicesClick(object sender, EventArgs e)
    {
        Presenter.ShowDialog<ServerRolesControl, ViewRolesForm, ServiceModel, Role>(this, new ViewRolesForm(), SetDeletedRolesLabel);
    }

インターフェイスメソッドを更新する必要がありますが、それを機能させるのは非常に面倒でした。今はそのままにしておきたいです =)。

于 2012-09-11T14:47:18.377 に答える