タイトルが正しく書かれていない場合は、私に許してください。リストを反復処理して、Tが工場から返されたときに値にアクセスするにはどうすればよいですか
私は、さまざまなデバイスのデータベーステーブルからデータを取得してリストを作成しています。異なるデバイスは同じプロパティを持つことができ、異なるプロパティを持つことになりますので、実行時にFactory Patternを使用して作成します。
ファクトリクラス:
public interface IImportModel
{
IList CreateImportList(SqlDataReader reader);
}
とコンクリートクラス:
public class Device1ImportModel : IImportModel
{
public string SerialNumber { get; set; }
public string PartA { get; set; }
public IList CreateImportList(SqlDataReader reader)
{
Device1ImportModel linkedItem = new Device1ImportModel();
List<Device1ImportModel> importList = new List<Device1ImportModel>();
while (reader.Read())
{
linkedItem = new Device1ImportModel();
linkedItem.SerialNumber = reader["SerialNo"].ToString();
linkedItem.PartA = reader["PartA"].ToString();
importList.Add(linkedItem);
}
return importList;
}
}
私は工場からデバイスを作成します。
importModel = ImportModelFactory.CreateImportModel("Device1");
今、私はimportModelを反復処理したい場合、 item.SerialNumberにアクセスしようとした行にコンパイル時エラーが表示されます
foreach (var item in importList)
{
string number = item.SerialNumber;
}
エラー:
'object' does not contain a definition for 'SerialNumber' and no extension method 'SerialNumber' accepting a first argument of type 'object' could be found.
私はブレークポイントを配置し、アイテムの変数を上にマウスを移動した場合、私はプロパティと値を見ることができます。
varの代わりにdynamicを使用しましたが、後で私のコードでLinqやLambdaのクエリを使用できなくなりました。
- どのように値にアクセスできますか?
- おそらくReflectionを使用してIListをListに変換できますか?
編集1
CreateImportModelのためのコードを追加しました:
static public IImportModel CreateImportModel(DeviceType device)
{
switch (device)
{
case DeviceType.Device1:
return new Device1ImportModel();
case DeviceType.Device2:
return new DeviceImportModel();
default:
return null;
}
}
'CreateImportModel'のソースコードを含めてください。 – mjwills
すべてのデバイスタイプに 'SerialNumber'がありますか? – mjwills