是否有将参数传递给另一个组件的模式?

时间:2012-03-30 15:00:47

标签: c# winforms design-patterns

从AssemblyA,AssemblyB,AssemblyC,AssemblyD等几个大会我在AssemblyE中调用一个方法

例如:

DialogHelper.DisplayComments( param1,2,3,4) ;

现在对于其中一些程序集而不是所有这些程序集我需要一个重载版本的DisplayComments()方法,它需要另外一个我要传递给的新参数:

DialogHelper.DisplayComments(param1,2,3,4,"5") ;

所以我做的就是:创建一个重载并传递值。

但是我想知道在.NET和面向Obeject的世界中是否还有其他优雅的方法可以这样做,所以我可以将这个值传递给那个程序集和那个方法?

4 个答案:

答案 0 :(得分:2)

如果你有源代码,你最好重载DisplayComments方法

否则(如果它们不是静态方法)你可以创建一个extension method,它还需要一个参数

答案 1 :(得分:1)

您可以使用params关键字。由于您有混合类型(int和string),因此您将有两个选项:

使用对象[]

public void DisplayComments(params object[] myVariableLengthParams)

在前4个参数后使用字符串参数:

public void DisplayComments(int param1, int param2, int param3, 
    int param4, params string[] myVariableStringParams)

或者,如果您使用4.0,则可以使用默认值(如果您使用面向公众的API,这可能不是最佳选择。如果默认情况发生变化,根据Daniel Hilgarth的评论,这可能会使事情与预期不同步。)

public void DisplayComments(int param1, int param2, int param3, 
    int param4, string param5 = "")

最后,您可以使用重载(但似乎params选项可能最适合您)。而且,这与使用默认值基本相同,如果逻辑在两者中都相同

 public void DisplayComments(int param1, int param2, int param3, int param4)
 {
     DisplayComments(int param1, int param2, int param3, int param4, "");
 }

 public void DisplayComments(int param1, int param2, int param3, int param4, 
     string param5)
 {
     //Final overload that does the logic
 }

如果逻辑不相同

 public void DisplayComments(int param1, int param2, int param3, int param4)
 {
     //Logic for 4 param
 }

 public void DisplayComments(int param1, int param2, int param3, int param4, 
     string param5)
 {
     //Logic for 5 param
 }

只要方法签名不相同(相同顺序,相同类型,相同返回类型),就可以使用多个具有相同名称的方法

答案 2 :(得分:1)

OOP世界重载已经非常优雅

如果您想尝试其他内容,可以添加Optional parameters,例如

DialogHelper.DisplayComments(string param1, int prm2, int prm3, int prm4, string paramOtional="5") ;
祝你好运

答案 3 :(得分:1)

尽量不要考虑将数据传递给另一个程序集。而是专注于简单地在对象和方法之间传递数据。那些类型的装配应该无关紧要。思考DialogHelper的方式就像服务一样。它为具有不同需求的消费者提供了一个对话框。他们生活的地方无关紧要,他们想要的是重要的一块。

这里似乎有一些消费者需要的可选额外评论参数。将此作为重载函数或具有可选参数

的单个函数提供是完全合理的
public class DialogHelper {
  public static void DisplayComments(
    object param1, 
    int param2,  
    int param3,
    int param4,
    string param5 = "") {
    ...
  }
}