如何将委托列表作为参数传递(以"pretty"方式)



我有一个构造函数太大了(12个参数(。所有这些参数要么是Actions(Action,Action(,要么是泛型委托(我有大约8个(。

如何传递委托列表,从而以可读的方式减少构造函数的参数数量?我想实现这样的目标:

// Controller //
var methods = new List<StrategyDelegate>()
{
model.OpenWindowMethod,
model.CloseWindowMethod
};
View(methods);
// View //
public delegate void StrategyDelegate();
private StrategyDelegate _openWindow;
private StrategyDelegate _closeWindow;
View(List<StrategyDelegate> methodsToCall)
{
_openWindow = methodsToCall.Find("model.OpenWindowMethod"); ???
_closeWindow = methodsToCall[1]; ???
}

但我不喜欢这两种方法,因为其中一种使用字符串,另一种我必须知道列表的顺序,如果我删除其中一种方法,我可能必须重新排序整个方法。

有什么想法吗?

将许多委托作为构造函数的参数传递听起来并不是最佳实践。将它们作为List<delegate>传递给我可能会更糟糕。这会带来一些额外的风险。但这应该不是问题。

如果你试图传递一个类作为参数:

public class MyActions
{
public StrategyDelegate OpenWindow { get; set; }
public StrategyDelegate CloseWindow { get; set; }
}

但这意味着方法(在这里声明为属性(可以随时更改。你可以将其更改为一个结构,这样它就会创建一个副本,这样在将操作传递给构造函数后就无法更改操作。


如果代理在运行时没有更改,我想我会选择继承:

我会创建一个抽象类:

public abstract class MyBaseClass
{
public abstract void OpenWindow();
public abstract void CloseWindow();  // <-- at least pass a object sender?
}
public class MyClass : MyBaseClass
{
public override void OpenWindow()
{ 
// you code:
}
public override void CloseWindow()
{
// you code:
}
}

public class ViewConfiguration 
{
public MyBaseClass _myBaseClass;
public ViewConfiguration(MyBaseClass myBaseClass)
{
_myBaseClass = myBaseClass;
}

public void CloseWindow()
{
_myBaseClass?.CloseWindow();
}
}

创建一个新的类,该类为要从控制器传递给View的不同委托设置了一整套方法;基元类型的简单示例:

public class ViewConfiguration {
public int a;
public int b;
public string c;
public bool d;
public ViewConfiguration setA(int newA) {
// setB, setC, and setD will follow a similar structure
a = newA;
return this;
}
}

然后控制器可以进行如下配置:

var config = new ViewConfiguration();
// you can do any combination/order of these
config.setA(2).setB(4).setC("hello").setD(true);

然后您可以将config传递到View中,View可以简单地执行config.a。您可能应该这样做,即只有geting才具有属性(直接隐藏set方法后面的设置字段(,但这是一个通用的想法。

最新更新