Во-первых, попробуйте рефакторинг общей функциональности и использование делегатов.
(пожалуйста, извините за мой плохой выбор имен, таких как "DoListAction"):
readonly Action<Process> removeBreakpoint = p => p.RemoveBreakpoint();
readonly Action<Process> addBreakpoint = p => p.AddBreakpoint();
void DoSingleAction(Action<Process> action)
{
var p = GetProcess(viewer);
if(p != null)
{
action(p); //invokes the action
BeginRefresh(null,null);
}
}
void DoListAction(Action<Process> action)
{
lvwProcessList.ForEach(action);
BeginRefresh(false, false);
}
private void ctxgrphAddBreakpoint_Click(object sender, EventArgs e)
{
DoSingleAction(addBreakpoint);
}
private void ctxgrphRemoveBreakpoint_Click(object sender, EventArgs e)
{
DoSingleAction(removeBreakpoint);
}
private void ctxlistAddBreakpoint_Click(object sender, EventArgs e)
{
DoListAction(addBreakpoint);
}
private void ctxlistRemoveBreakpoint_Click(object sender, EventArgs e)
{
DoListAction(removeBreakpoint);
}
тогда вы можете объединить DoProcessAction и DoListAction:
void DoAction(object sender, Action<Process>)
{
if(sender is ListView)
{
lvwProcessList.ForEach(action);
BeginRefresh(false, false);
}
else if (sender is GraphView)
{
var p = GetProcess(viewer);
if(p != null)
{
action(p); //invokes the action
BeginRefresh(null,null);
}
}
else {throw new Exception("sender is not ListView or GraphView");}
}
//and update all the handlers to use this, and delete DoSingleAction and DoListAction:
private void ctxgrphAddBreakpoint_Click(object sender, EventArgs e)
{
DoAction(sender, addBreakpoint);
}
//etc.
Независимо от того, что в каждом обработчике событий, я думаю, вам нужно будет указать, какое действие предпринять. Я не уверен, что методы наследования или расширения действительно будут вашим другом в этом случае, но вот как это будет выглядеть, используя методы расширения:
//these two are in a separate static class
public static InvokeAction(this ListView listView, Action<Process> action)
{ ... }
public static InvokeAction(this GraphView listView, Action<Process> action)
{ ... }
private void handler(object sender, Action<Process> action)
{
var lv = sender as ListView;
var gv = sender as GraphVeiw;
lv.InvokeAction(action); //(need to check for null first)
gv.InvokeAction(action);
if(lv == null && gv == null) {throw new Exception("sender is not ListView or GraphView");}
}
//then update all the handlers:
private void ctxgrphAddBreakpoint_Click(object sender, EventArgs e)
{
handler(sender, addBreakpoint);
}
C # 2 / .NET 2.0
Чтобы сделать это в C # 2 (VS2005), первый способ использования делегатов все еще будет работать, вы просто не можете иметь лямбды. (2.0 имеет делегата Action<T>
). Просто измените лямбда-функции на функции. Все остальное будет работать правильно.
void removeBreakpoint(Process p) { p.RemoveBreakpoint(); }
void addBreakpoint(Process p) { p.AddBreakpoint(); }
//you could also do this, but it's overkill:
readonly Action<Process> removeBreakpoint = delegate(Process p) { p.RemoveBreakpoint(); };
readonly Action<Process> addBreakpoint = delegate(Process p) { p.AddBreakpoint(); };