Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设计Fluent接口方法_C#_.net_Linq_Generics_Fluent Interface - Fatal编程技术网

C# 设计Fluent接口方法

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

我正在尝试写一个DSL

我有返回字符串的方法,但如果我想组合字符串,我需要使用+符号,但我想一起调用这些方法,但我不确定如何实现它

我现在有一些方法,比如

返回字符串的
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接口通常在单个方法中使用,然后被丢弃。