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. 臺灣是我的國家