gpt4 book ai didi

c# - 是否有等效于 Java 的 ToStringBuilder for C#?一个好的 C# 版本有什么特点?

转载 作者:太空狗 更新时间:2023-10-29 22:53:32 30 4
gpt4 key购买 nike

在 Java 世界中,我们有 Apache Commons' ToStringBuilder帮助创建 toString() 实现。

有人知道 C# 的一个不错的免费实现吗?有没有我不知道的更好的选择?

如果不存在免费的实现,那么我猜这个问题就变成了一个“在 C# 3 中什么是好的 ToStringBuilder?”

在我的脑海中:

  • 它可以提供反射和手动创建 ToString 字符串。

  • 如果它能利用表达式树,那就太棒了。

像这样的..

 public override string ToString()
{
return new ToStringBuilder<Foo>(this)
.Append(t => t.Id)
.Append(t => t.Name)
.ToString();
}

哪个会返回:

 "Foo{Id: 1, Name: AName}"
  • 它可以使用 System.Reflection.Emit 预编译 ToString 委托(delegate)。

还有其他想法吗?

更新

只是为了阐明 ToStringBuilder 与 StringBuilder 不同。我正在寻找类似于 Apache Common 的 ToStringBuilder 功能的东西,它具有多行格式、不同样式和基于反射的 ToString 创建等功能。谢谢。

更新 2

我已经建立了自己的。参见 here .

最佳答案

编辑:好的,您想要使用反射,这样您就不必键入属性名称。我认为这会让你得到你想要的:

// forgive the mangled code; I hate horizontal scrolling
public sealed class ToStringBuilder<T> {
private T _obj;
private Type _objType;
private StringBuilder _innerSb;

public ToStringBuilder(T obj) {
_obj = obj;
_objType = obj.GetType();
_innerSb = new StringBuilder();
}

public ToStringBuilder<T> Append<TProperty>
(Expression<Func<T, TProperty>> expression) {

string propertyName;
if (!TryGetPropertyName(expression, out propertyName))
throw new ArgumentException(
"Expression must be a simple property expression."
);

Func<T, TProperty> func = expression.Compile();

if (_innerSb.Length < 1)
_innerSb.Append(
propertyName + ": " + func(_obj).ToString()
);
else
_innerSb.Append(
", " + propertyName + ": " + func(_obj).ToString()
);

return this;
}

private static bool TryGetPropertyName<TProperty>
(Expression<Func<T, TProperty>> expression, out string propertyName) {

propertyName = default(string);

var propertyExpression = expression.Body as MemberExpression;
if (propertyExpression == null)
return false;

propertyName = propertyExpression.Member.Name;
return true;
}

public override string ToString() {
return _objType.Name + "{" + _innerSb.ToString() + "}";
}
}

例子:

// from within some class with an Id and Name property
public override string ToString() {
return new ToStringBuilder<SomeClass>(this)
.Append(x => x.Id)
.Append(x => x.Name)
.ToString();
}

看,你所追求的行为:

class Thing {
public int Id { get; set; }
public string Name { get; set; }

public override string ToString() {
return new ToStringBuilder<Thing>(this)
.Append(t => t.Id)
.Append(t => t.Name)
.ToString()
}
}

void Main() {
var t = new Thing { Id = 10, Name = "Bob" };
Console.WriteLine(t.ToString());
}

输出:

Thing{Id: 10, Name: "Bob"}

关于c# - 是否有等效于 Java 的 ToStringBuilder for C#?一个好的 C# 版本有什么特点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2417647/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com