LinqToEntityで取り出したデータをお手軽にCSVにしたい
LinqToCSVとか色々あるんだけど帯に短し襷に長し。
もっと簡単に使いたいんだよな。
と、思ったのでリフレクションの復習も兼ねて自作してみる。
仕様
- IEnumerable<T>から出力
- 基本的にはClassの設計通りに出力する
- 1:1の参照だったらリンク先のオブジェクトも処理したい
- このへんはAnnotationで制御したい
- プロパティタイトル
- 非出力プロパティ
- 出力順
- 出力フォーマット
- 参照先を含めるかどうか
- フォーマットあたりでdelegateするとか。
こんな感じにしたらEF関係なく使えそうかな。
情報収集
IEnumerable<T>からTを取得する
IEnumerable<T> myEnumerable;
Type type = myEnumerable.GetType().GetGenericArguments()[0];
c# - getting type T from IEnumerable<T> - Stack Overflow
ここいらへん。
テストしてみる。
private string genericParameter(Object o) { StringBuilder buff = new StringBuilder(); buff.Append( string.Join(",", o.GetType().GetGenericArguments().Select(t => t.Name).ToArray()) + "\r\n"); return buff.ToString(); } private void genericTypeToolStripMenuItem_Click(object sender, EventArgs e) { textBox1.Text = ""; textBox1.Text += "string : " + genericParameter(""); textBox1.Text += "List<string> : " + genericParameter(new List<string>()); textBox1.Text += "KeyValuePair<int, string> : " + genericParameter(new KeyValuePair<int, string>()); textBox1.Text += "List<KeyValuePair<int, string>> : " + genericParameter(new List<KeyValuePair<int, string>>()); textBox1.Text += "Dictionary<string,KeyValuePair<int, string>> : " + genericParameter(new Dictionary<string, KeyValuePair<int, string>>()); }
出力結果
string : List<string> : String KeyValuePair<int, string> : Int32,String List<KeyValuePair<int, string>> : KeyValuePair`2 Dictionary<string,KeyValuePair<int, string>> : String,KeyValuePair`2
ふむ。
stringはGenericパラメータを持たないので空白。
ListやKVPはきちんと取得出来てる。
4つ目以降のTypeOf-TypeOfの形だとルートクラスのGetGenericArgsでは自身の直接のジェネリックタイプだけ出てくるのがわかる。
`2 ってのは2つのジェネリックタイプを持ってるって印かな。
Typeにやたら沢山あるGeneric系メンバってナンジャラホイ。
プロパティ一覧を取り出してみる
これはType.GetPropertiesでいけそう。
Type.GetProperties メソッド (BindingFlags) (System)
BindingFlags 列挙体 (System.Reflection)
private void getPropertiesToolStripMenuItem_Click(object sender, EventArgs e) { Type t = typeof(Form1); textBox1.Text = string.Join("\r\n", t.GetProperties(BindingFlags.Public | BindingFlags.Instance) .Select(p => string.Format("{0} : {1}", p.PropertyType.Name, p.Name)) .ToArray() ); }
結果
IButtonControl : AcceptButton Form : ActiveMdiChild Boolean : AllowTransparency Boolean : AutoScale Size : AutoScaleBaseSize Boolean : AutoScroll Boolean : AutoSize AutoSizeMode : AutoSizeMode AutoValidate : AutoValidate Color : BackColor FormBorderStyle : FormBorderStyle IButtonControl : CancelButton (以下略)
いけた。