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

Posted

技术标签:

【中文标题】创建由参数/委托发送的类的实例【英文标题】:Create an instance of a class sent by parameter / Delegates 【发布时间】:2013-06-18 16:17:43 【问题描述】:

我正在尝试通过使用delegates 或使用class instance as parameter 来稍微优化我的代码。我对 C# 还是很陌生,我还不确定哪一个是更好的方法,假设我一开始就走在正确的轨道上。但我的问题与发送一个类实例作为参数有关。让我解释。我正在尝试关注this logic,但我失败了.... 我创建了一个带有几个按钮的 VSTO 功能区。它看起来有点像这样: 现在,我正在尝试向按钮添加一些功能,因此单击每个按钮会打开一个新的任务窗格。

我为位于GSMRibbon.cs 中的Calendar 功能区按钮编写了这段代码 注意:我认为对于更有经验的程序员来说,这段代码会很容易理解,但如果你们不明白,请在我将解释的 cmets 中告诉我)。

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;

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

【问题讨论】:

【参考方案1】:

您可以使用泛型来做到这一点:

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

【讨论】:

【参考方案2】:

您似乎在寻找的是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");

【讨论】:

您的通用约束在这里不正确 - T 实际上是 UserControl,而不是 TaskPane,您还需要一个新约束,否则构造函数调用将失败。 哎呀,谢谢!自从我使用通用约束以来已经有一段时间了:)

以上是关于创建由参数/委托发送的类的实例的主要内容,如果未能解决你的问题,请参考以下文章

Activator.CreateInstance - 如何创建具有参数化构造函数的类的实例

工厂方法(FactoryMethod)

设计模式-创建型模式

工厂方法设计模式

二十三个设计模式导图

Python设计模式:创建型