如何思考這個問題顛倒。而不是使每個對象的功能都瞭解DataRow
格式,讓每個對象都瞭解DataRow
格式。如果你不使用object.ToString()
什麼,你可以讓ConfigurationItem
和OptionalItem
實施object.ToString()
:
class ConfigurationItem
{
public string override ToString()
{
return string.Format("{0}: {1}\n", Name, Value);
}
}
class OptionalItem
{
public string override ToString()
{
return string.Format("{0}, ", Name);
}
}
現在你可以使用一個循環對所有類型的對象:
string BuildDataRowString(IEnumerable collection)
{
var sb = new StringBuilder();
foreach (var o in collection) sb.Append(o.ToString());
return sb.ToString();
}
row["configurations"] = car.Configurations.BuildDataRowString();
row["optionals"] = car.Optionals.BuildDataRowString();
如果您需要object.ToString()
出於其他目的,您可以添加一個自定義格式爲「DataRow
格式」:
class ConfigurationItem : IFormattable
{
public string override ToString(string format, IFormatProvider formatProvider)
{
if (format == "D") {
return string.Format(formatProvider, "{0}: {1}\n", Name, Value);
}
return this.ToString(); // otherwise format as default
}
}
class OptionalItem : IFormattable
{
public string override ToString(string format, IFormatProvider formatProvider)
{
if (format == "D") {
return string.Format(formatProvider, "{0}, ", Name);
}
return this.ToString(); // otherwise format as default
}
}
string BuildDataRowString(this IEnumerable e, string format)
{
StringBuilder sb = new StringBuilder();
foreach (var o in e) sb.AppendFormat("{0:D}", o);
return sb.ToString();
}
我在想什麼使用索引名稱的數組,但後來我看到你正在調用'car.Optionals'。你可以通過反射來做到這一點,但這並不會讓它變得更好。 – Marnix
配置和選項是否來自一個公共基類?如果不是,那麼重要的簡化可能會涉及反思。如果你要這麼做很多,你可以證明編寫obj.FormattedOutput(「{Name}:{Value} \ n」)函數是合理的。 –