さまざまな種類のCSVファイルを読み込むクラスを作成しています。 Modelクラスに基づいて重要な情報を取り出します。ここでモデルクラスのプロパティは取得したい列名です。たとえば、列FromAddressとToAddressを持つOutlookModelを持つことができます。あるいは、全く異なる列を持つSalesforceModelを持つことができます。リストタイプを動的に作成する(または別のコレクションですか?)
リーダークラスが行と列を解析すると、モデルクラスのインスタンスにセルが読み込まれます。以下のコードでは、引数className = OutlookModelです。ここで最も関連性の高いコード行は、署名と返品です。
protected void MapColumns(string row, string className, List<OutlookModel> list)
{
string[] cols = row.Split(',');
// create a model to save the important columns
var model = Activator.CreateInstance(nameSpace, nameSpace + className);
int j = 0;
if (cols.Length > 0)
{
foreach (var c in cols)
{
// is this column index one of our important columns?
if (Ordinals.ContainsKey(j))
{
// this is a column we care about, so set the model property
model.GetType().GetProperty(Ordinals[j]).SetValue(model, c);
}
j++;
}
}
list.Add(model);
}
私が抱えている問題は、モデルオブジェクトのコレクションです。引数にオブジェクトをList < OutlookModel>として定義すると、このメソッドは拡張できません。リスト<オブジェクト>として定義すると、モデル間ですべて異なるプロパティを使用するために内部リストをキャストする必要があります。
私はC#のかなり新しいです。これらの異なるモデルタイプをリスト/配列/コレクション/に取り込むより良い方法はありますか?それで、リストにロジックを適用できますか?
実行時に 'Ordinals'が含まれているものは何ですか?このメソッドを呼び出す前に値を変更しますか? – thehennyy
オーディナルは、Excelファイルのヘッダーの列インデックスを含む辞書です。 Excelファイルのヘッダーはモデルのプロパティと一致し、それが辞書の値になります。たとえば、3番目の列が「FromAddress」の場合、Ordinals [2] = FromAddressになります。 Ordinalsディクショナリには、Excelファイルの最初の行がロードされます。このMapColumnsメソッドは、後続の各行に対して実行されます。 –
tugowar
このメソッドのシグネチャを使用する必要がありますか? – thehennyy