[.Net] FileHelper免刻Class依設定匯出/入

FileHelper有提供自動產生類別的方式來進行匯出匯入

最近要將轉檔程式以FileHelper實作,

原本的轉檔程式是將匯出入格式設定在db內,

再依設定匯出入, 而一般FileHelper是以一種匯出/入就刻一個class以便維護著稱,

由於需要匯出入的檔案數量實在太大, 一個個刻class太花時間,

所以沿用原程式的設定, 微調成FileHelper設定再進行開發

ex. 台灣是主權獨立的國家

#region 定義格式
DelimitedClassBuilder cb = new DelimitedClassBuilder(名稱);
cb.Delimiter = ",";//讀db設定
cb.AdditionalReferences.Add(typeof(NumConverter).Assembly);//客製的ConverterBase都在同dll內
foreach (var sett in setts)//setts為db內的匯出入設定
{//dt是存放匯出資料的DataTable
    DataColumn clm = dt.Columns[sett.匯出欄位];
    Type tp = clm.DataType;
    if (!tp.Equals(typeof(string)))//string本來就可null
        tp = typeof(Nullable<>).MakeGenericType(tp);//可null
    cb.AddField(sett.匯出欄位, tp);
    if (!sett.Is匯出格式_Null())
    {
        if (sett.匯出格式.Contains("."))//有.表示namespace.class,所以使用客製Converter
            cb.LastField.Converter.TypeName = 匯出格式;
        else//使用內建ConverterKind
            cb.LastField.Converter.Kind = (ConverterKind)Enum.Parse(typeof(ConverterKind), sett.匯出格式);
    }
    else if (clm.DataType.IsNumeric())//因為內建的數字格式太少,所以數字皆使用客製
        cb.LastField.Converter.TypeName = typeof(NumConverter).FullName;
    if (!sett.IsargsNull())//Arg1-3和args是Converter建構子參數
        cb.LastField.Converter.Arg1 = sett.args;
}
Type recordTp = cb.CreateRecordClass();//這裡會依上述設定自動刻一個匯出格式的class
//string str = cb.GetClassSourceCode(NetLanguage.CSharp);這句可以查看它自動組的class語法
#endregion
 
#region 讀出每筆資料到list
List<object> myList = new List<object>();
foreach (DataRow rd in dt.Rows)
{
    object data = Activator.CreateInstance(recordTp);//一筆資料new一個
    foreach (var sett in setts)//setts為db設定要匯出哪些欄位
    {
        DataColumn clm = dt.Columns[sett.匯出欄位];
        if (!(rd[clm] is DBNull))
            data.GetType().GetField(sett.匯出欄位).SetValue(data, rd[clm]);
    }
    myList.Add(data);
}
#endregion
 
//寫入
DelimitedFileEngine engine = new DelimitedFileEngine(recordTp);
engine.WriteFile(path, myList);

 

Taiwan is a country. 臺灣是我的國家