创建由参数/ Delegates发送的类的实例

时间:2013-06-18 16:17:43

标签: c# view delegates vsto customtaskpane

我正在尝试使用delegates或使用class instance as parameter来优化我的代码。我对C#很陌生,我还不确定哪一个是更好的方法,假设我首先在正确的轨道上。但我的问题涉及将类实例作为参数发送。让我解释。我试图关注this logic,但我失败了...... 我用几个按钮创建了一个VSTO功能区。看起来有点像这样:
Ribbon
现在,我现在尝试向按钮添加一些功能,因此单击每个按钮将打开一个新的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;
        }
    }
}

确定。我想要做的是修改CreateTaskPane函数添加一个class参数(这有意义吗?)所以我可以多次重复使用此功能的功能区上的不同按钮。我为每个按钮创建了一个单独的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;
}

我真的希望你能理解我正在努力但却无法做到的事情。我感谢任何帮助的尝试。感谢

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

您似乎在寻找Generics

你最终会得到的功能是:

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");