创建由参数/委托发送的类的实例
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
,您还需要一个新约束,否则构造函数调用将失败。
哎呀,谢谢!自从我使用通用约束以来已经有一段时间了:)以上是关于创建由参数/委托发送的类的实例的主要内容,如果未能解决你的问题,请参考以下文章