编辑:好的,你想使用反射,这样你就不必键入属性名称。我认为这会让你得到你所追求的:
// 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”}