C# 设计Fluent接口方法
我正在尝试写一个DSL 我有返回字符串的方法,但如果我想组合字符串,我需要使用+符号,但我想一起调用这些方法,但我不确定如何实现它 我现在有一些方法,比如 返回字符串的C# 设计Fluent接口方法,c#,.net,linq,generics,fluent-interface,C#,.net,Linq,Generics,Fluent Interface,我正在尝试写一个DSL 我有返回字符串的方法,但如果我想组合字符串,我需要使用+符号,但我想一起调用这些方法,但我不确定如何实现它 我现在有一些方法,比如 返回字符串的MyStaticClass.Root()MyStaticClass.And()MyStaticClass.AnyInt() 我希望能够做到 Root()和()。使用StringBuilder 示例 StringBuilder builder = new StringBuilder(); builder.Append("One st
MyStaticClass.Root()MyStaticClass.And()MyStaticClass.AnyInt()
我希望能够做到
Root()和()。使用StringBuilder
示例
StringBuilder builder = new StringBuilder();
builder.Append("One string ").Append("Second string").Append("Another string");
string final = builder.ToString();
如果需要简单的自定义FluentInterface,请使用以下命令:
public class MyOwnStringBuilder
{
public StringBuilder Builder;
public MyOwnStringBuilder()
{
this.Builder = new StringBuilder();
}
public static MyOwnStringBuilder Root
{
get{return new MyOwnStringBuilder();}
}
public string End
{
get{return Builder.ToString();}
}
public MyOwnStringBuilder And(string value)
{
Builder.Append(value);
return this;
}
public MyOwnStringBuilder AnyInt(string value)
{
Builder.Append(value);
return this;
}
}
您可以使用它:
MyOwnStringBuilder.Root
.And("some value")
.AnyInt("some new value")
.End;
问候。您不需要使用+符号。使用StringBuilder
示例
StringBuilder builder = new StringBuilder();
builder.Append("One string ").Append("Second string").Append("Another string");
string final = builder.ToString();
如果需要简单的自定义FluentInterface,请使用以下命令:
public class MyOwnStringBuilder
{
public StringBuilder Builder;
public MyOwnStringBuilder()
{
this.Builder = new StringBuilder();
}
public static MyOwnStringBuilder Root
{
get{return new MyOwnStringBuilder();}
}
public string End
{
get{return Builder.ToString();}
}
public MyOwnStringBuilder And(string value)
{
Builder.Append(value);
return this;
}
public MyOwnStringBuilder AnyInt(string value)
{
Builder.Append(value);
return this;
}
}
您可以使用它:
MyOwnStringBuilder.Root
.And("some value")
.AnyInt("some new value")
.End;
注意。这些方法应该返回一个包装类。这些方法也是包装类的实例方法。例如:
class Fluent
{
private string _value;
public Fluent And()
{
this._value += "whatever";
return this;
}
public Fluent AnyInt()
{
this._value += "42";
return this;
}
public override string ToString() { return _value; }
}
您还可以定义从Fluent
到字符串的隐式或显式转换,而不是(或除了)重写ToString()
另外,对于生产代码,我会使用字符串生成器来避免对Concat
的多次调用,这些方法应该返回一个包装类。这些方法也是包装类的实例方法。例如:
class Fluent
{
private string _value;
public Fluent And()
{
this._value += "whatever";
return this;
}
public Fluent AnyInt()
{
this._value += "42";
return this;
}
public override string ToString() { return _value; }
}
您还可以定义从Fluent
到字符串的隐式或显式转换,而不是(或除了)重写ToString()
另外,对于生产代码,我会使用字符串生成器来避免对Concat
的多次调用,但您始终需要调用end?这也是一个网络应用程序,所以它是线程安全的。不确定静态如何工作以保证线程安全回答得很好;但是,我要重命名该类:-)是的,您应该调用End,并且线程安全没有问题@phoog我以问题中提议的名字命名它,但是是的,最好改名。谢谢你的回答。但我不喜欢每次都打电话给End。我猜没有太多的选择thoughEnd(),所以在N个链之后,您告诉类返回值。对于这样简单的FluentInterface,最好使用Root()或Start()和End()。看看StringBuilder,您可以一直链接到调用ToString(),这基本上是一个End()调用。接受我的回答,因为我提供了你们想要的一切。但你们总是需要打电话结束吗?这也是一个网络应用程序,所以它是线程安全的。不确定静态如何工作以保证线程安全回答得很好;但是,我要重命名该类:-)是的,您应该调用End,并且线程安全没有问题@phoog我以问题中提议的名字命名它,但是是的,最好改名。谢谢你的回答。但我不喜欢每次都打电话给End。我猜没有太多的选择thoughEnd(),所以在N个链之后,您告诉类返回值。对于这样简单的FluentInterface,最好使用Root()或Start()和End()。看看StringBuilder,您可以一直链接到调用ToString(),这基本上是一个End()调用。接受作为答案,因为我提供了您想要的一切。字符串生成器追加?隐式转换是什么样的结果?这个线程也是安全的吗?公共静态隐式运算符字符串(Fluent f){return f.ToString();}
。请参阅@Jon,除非您计划从多个线程使用同一实例,否则线程安全不是您应该担心的问题。Fluent接口通常在单个方法中使用,然后被丢弃?隐式转换是什么样的结果?这个线程也是安全的吗?公共静态隐式运算符字符串(Fluent f){return f.ToString();}
。请参阅@Jon,除非您计划从多个线程使用同一实例,否则线程安全不是您应该担心的问题。Fluent接口通常在单个方法中使用,然后被丢弃。