Azureはじめました

Windows Azureで業務システムを組んでみる日記

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系メンバってナンジャラホイ。

http://10.hateblo.jp/entry/2014/06/24/152438
記事を分けた。

プロパティ一覧を取り出してみる

これはType.GetPropertiesでいけそう。
Type.GetProperties メソッド (BindingFlags) (System)
BindingFlags 列挙体 (System.Reflection)
f:id:twisted0517:20140624154813p:plain

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
(以下略)

いけた。