chi*_*tom 16 c# java reflection tostring apache-commons
在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();
}
Run Code Online (Sandbox Code Playgroud)
哪个会回归:
"Foo{Id: 1, Name: AName}"
Run Code Online (Sandbox Code Playgroud)
还有其他想法吗?
UPDATE
只是为了澄清ToStringBuilder是一个与StringBuilder不同的生物.我正在寻找类似于Apache Common的ToStringBuilder功能的东西,它具有多行格式化,不同样式和反射基础ToString创建等功能.谢谢.
更新2
我已经建立了自己的.看到这里.
Dan*_*Tao 13
编辑:好的,你想使用反射,所以你不必输入属性名称.我想这会让你得到你想要的东西:
// 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() + "}";
}
}
Run Code Online (Sandbox Code Playgroud)
例:
// 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();
}
Run Code Online (Sandbox Code Playgroud)
看,你所追求的行为:
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());
}
Run Code Online (Sandbox Code Playgroud)
输出:
事{Id:10,姓名:"鲍勃"}
| 归档时间: |
|
| 查看次数: |
2987 次 |
| 最近记录: |