方法の2番目のパラメータに関する追加.ToArray()
の呼び出しを必要とします。関数をそれぞれのオブジェクトに対して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);
}
}
今、あなたは、オブジェクトのすべてのタイプのための単一のループを使用することができます:あなたがobject.ToString()
が必要な場合は
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();
を他の目的で、「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")のような関数を書く努力を正当化することができます –