2

デリゲートを使用するか、クラス インスタンスをパラメーターとして使用して、コードを少し最適化しようとしています。私はC#にかなり慣れていませんが、そもそも正しい軌道に乗っていると仮定すると、どちらがより良いアプローチなのかまだわかりません。しかし、私の問題は、クラスインスタンスをパラメーターとして送信することに関連しています。説明させてください。私はこのロジックに従おうとしていますが、失敗しています....
いくつかのボタンでVSTOリボンを作成しました。次のよう
リボン
になります。ボタンに機能を追加しようとしているので、各ボタンをクリックすると新しい TaskPane が開きます。

Calendarメモにあるリボンボタン用にこのコードを書きましたGSMRibbon.cs 。経験豊富なプログラマーにとって、このコードは非常に理解しやすいと思いますが、何か理解できない場合は、コメントでお知らせください)。

namespace GSM
{
    public partial class GSMRibbon
    {
        private void GSMRibbon_Load(object sender, RibbonUIEventArgs 
        {
        }

        private CustomTaskPane taskPane;

        private CustomTaskPane TaskPane
        {
            get
            {
                return this.taskPane;
            }
        }

        private void vendors_calendar_Click(object sender, RibbonControlEventArgs e)
        {
            string newTitle = "PO Calendar";

            if (TaskPane != null)
            {
                if (TaskPane.Title != newTitle)
                {
                    Globals.ThisAddIn.CustomTaskPanes.Remove(TaskPane);
                    CreateTaskPane(newTitle);
                }
                else
                {
                    taskPane.Visible = true;
                }
            }
            else
            {
                CreateTaskPane(newTitle);
            }
        }

        private void CreateTaskPane(string title)
        {
            var taskPaneView = new CalendarView();
            taskPane = Globals.ThisAddIn.CustomTaskPanes.Add(taskPaneView, title);
            taskPane.Visible = true;
        }
    }
}

Ok。私がやりたかったのは、classパラメーターを追加して CreateTaskPane 関数を変更することでした (これは意味がありますか?)。これにより、リボンのさまざまなボタンに対してこの関数を複数回再利用できます。Viewボタンごとに個別に を作成しましたが、 を渡す方法がわかりませんView
だから、私はこのようなものの後:(CalendarViewはビューの名前です)

CreateTaskPane(new CalendarView(), newTitle);

そして次のような関数:

private void CreateTaskPane(object typeOfView, string title)
{
    var taskPaneView = new (typeOfView)Object;
    taskPane = Globals.ThisAddIn.CustomTaskPanes.Add(taskPaneView, title);
    taskPane.Visible = true;
}

私が何をしようとしているのか、自分ではできないことを理解していただければ幸いです。助けていただければ幸いです。ありがとう

4

2 に答える 2

3

これを行うには、ジェネリックを使用できます。

private void CreateTaskPane<T>(string title) where T : UserControl, new()
{
    T taskPaneView = new T();
    taskPane = Globals.ThisAddIn.CustomTaskPanes.Add(taskPaneView, title);
    taskPane.Visible = true;
}

次に、次の方法で呼び出します。

CreateTaskPane<CalendarView>(newTitle);

または、これを次のように書くこともできます。

private void CreateTaskPane<T>(T taskPaneView, string title) where T : UserControl
{
    taskPane = Globals.ThisAddIn.CustomTaskPanes.Add(taskPaneView, title);
    taskPane.Visible = true;
}

次に、次の方法で呼び出します。

CreateTaskPane(new CalendarView(), newTitle);
于 2013-06-18T16:20:58.343 に答える
1

あなたが探しているように見えるのはジェネリックです

最終的に得られる関数は次のようなものです。

private void CreateTaskPane<T>(string title) where T : UserControl, new()
{
   var taskPaneView = new T();
   taskPane = Globals.ThisAddIn.CustomTaskPanes.Add(taskPaneView, title);
   taskPane.Visible = true;
}

// Later on..
CreateTaskPane<CalenderTaskPane>("Calender");
于 2013-06-18T16:21:23.567 に答える