ここでは、オブジェクトを取得してプロパティ値を読み取り、それをcsv'd文字列としてフォーマットする実装を行っています。
Write.WriteObject()
は、どのように使用するかの例です。
public static class StringExtensions
{
public static string ToCSV(this object field, bool first)
{
if(field != null)
{
string retVal = field.ToString();
retVal = retVal.Contains(",") || retVal.Contains("\"") || retVal.Contains("\r\n")
? "\"" + retVal + "\"" : retVal;
retVal = first ? retVal : "," + retVal;
return retVal;
}
else
{
return first ? "" : ",";
}
}
}
public class Format
{
public string CommaSeparatedObject(Type layoutType, object value, bool header)
{
bool first = true;
string retVal = "";
PropertyInfo[] props = layoutType.GetProperties();
if (header)
{
foreach (PropertyInfo prop in props)
{
retVal += prop.Name.ToCSV(first);
first = false;
}
}
else
{
foreach (PropertyInfo prop in props)
{
retVal += prop.GetValue(value).ToCSV(first);
first = false;
}
}
return retVal;
}
}
public class Write
{
public void WriteObject(IEnumerable<myClass> myObj)
{
StreamWriter sw = new StreamWriter(parameters.OutputFile, true, Encoding.ASCII, 16 * 1024);
sw.WriteLine(new Format().CommaSeparatedObject(typeof(myClass), item, true))); //write header
foreach(var item in myObj)
{
sw.WriteLine(new Format().CommaSeparatedObject(typeof(myClass), item, false)));
}
}
}
単一オブジェクト内の200のプロパティ...? 200?ワット?どういうわけか、あなたの状況を正しく説明してくれなかったと感じています... – elgonzo
彼はスニペットでプロパティ名を書く必要があり、プロパティ名を書く必要がありません。これは私の推測です...だから、ソースオブジェクトと型と構造が必要です。 –
@AndrewPaes、私は、リフレクションを使用するコメントでほぼ示唆していました。しかし、200以上の物件は、私の目では面倒くさいと思っているだけです。あなたが言ったように、おそらく他のタイプ/構造/データセットが関与しているだけでなく、単純にプロパティが... – elgonzo