我遇到的情况是我需要在整个过程中构建一条消息。在此过程中,有几个函数和类,此消息必须收集信息。构建此消息的最佳方法是什么?
示例:
public class process{
public StringBuilder message = new StringBuilder();
private void DoStep1
{
AddNote("start");
var p2 = new process2();
p2.DoStuff();
var p3 = new process3();
p3.DoStuff();
SendEmailMethod(message);
}
private void AddNote(string msg)
{
//do stuff
message.Append(msg);
}
}
public class process2{
public void DoStuff()
{
//need to append msg to that variable
}
}
public class process3{
public void DoStuff()
{
//need to append msg to that variable
}
}
答案 0 :(得分:6)
您可以将初始化的StringBuilder
传递给其他类中的所有方法。
public class process{
public StringBuilder message = new StringBuilder();
private void DoStep1
{
AddNote("start");
var p2 = new process2();
p2.DoStuff(message);
var p3 = new process3();
p3.DoStuff(message);
SendEmailMethod(message);
}
private void AddNote(string msg)
{
//do stuff
message.Append(msg);
}
}
public class process2{
public void DoStuff(StringBuilder stringBuilder)
{
//need to append msg to that variable - use stringBuilder
}
}
public class process3{
public void DoStuff(StringBuilder stringBuilder)
{
//need to append msg to that variable - use stringBuilder
}
}
你应该记录那些他们期望初始化StringBuilder
的类,或者如果它是null则抛出异常。
public class process3{
public void DoStuff(StringBuilder stringBuilder)
{
if (stringBuilder == null)
throw new ArgumentException("stringBuilder must be initialised");
//need to append msg to that variable - use stringBuilder
}
}
答案 1 :(得分:0)
我会用某种形式的构建器模式处理这个问题,这样你至少可以传递一个公共引用,而不仅仅是简单地接受一个StringBuilder。显然这不是必需的,但它会明确地保持您的代码更清洁,并允许它在需要时增长和缩小。
答案 2 :(得分:0)
您可以在静态方法中使用静态StringBuilder
。说:
public static StringBuilder builder;
static void AddToString(string s)
{
if(builder == null)
builder = new StringBuilder(s);
builder.Append(s); // new line?: s + "\r\n"
}
如果你在类中只有一个静态变量,那么这可能是一个静态类。
答案 3 :(得分:0)
您所描述的基本上是一个工作流程。您通常可以使用chain of responsibility实施或更常见的pipeline实施此设置。让管道的每个元素实现相同的接口,包括在管道中设置下一个元素并调用管道中的下一个元素的能力。
考虑是否可以设置管道一次并不断重复使用它。这通常是你用这种方法做的事情。
.NET提供Windows Workflow Foundation(除非你的场景很复杂,否则它可能有点过分),任务并行库中的Dataflow也适用于管道 - 但简单的对象也可以做到这一点,不要结束 - 工程师!
你正在寻找传递某种上下文(比如其他人提到的初始化StringBuilding - 或者可能是你需要的更丰富的内容),然后将它构建起来。