我正在尝试使用delegates或使用class instance as parameter来优化我的代码。我对C#很陌生,我还不确定哪一个是更好的方法,假设我首先在正确的轨道上。但我的问题涉及将类实例作为参数发送。让我解释。我试图关注this logic,但我失败了......
我用几个按钮创建了一个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;
}
}
}
确定。我想要做的是修改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;
}
我真的希望你能理解我正在努力但却无法做到的事情。我感谢任何帮助的尝试。感谢
答案 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");