私は古いアプリケーション (1.1 日から) 内で作業しており、次のような非汎用コレクションが多数あります。
[Serializable]
public class MyEntityList : CollectionBase
{
private int _virtualRecordCount;
public int VirtualRecordCount
{
get { return _virtualRecordCount; }
set { _virtualRecordCount = value; }
}
public MyEntityList()
{
}
public MyEntityList(MyEntity[] arr)
{
AddRange(arr);
}
public MyEntityList this[int index]
{
get { return (MyEntity)InnerList[index]; }
}
public void Add(MyEntity item)
{
InnerList.Add(item);
}
etc...
Collection<T>
戻り値の型にジェネリックを使用するようにアプリケーションのレイヤーをアップグレードしました。このレイヤーは自動生成され、クラス名はデータソース テーブル名に基づいています。ビジネス エンティティ クラスも一列に並んでいる必要はありませんが、この場合はそうではありません。この場合、それらは完全に 1:1 で一致します。
コレクションを次のようにマッピングしてみました:
Collection<MyEntityResponse> responses = GetMyEntityResponses();
AutoMapper.Mapper.CreateMap<MyEntityResponse, MyEntity>();
myEntityList = AutoMapper.Mapper.Map<MyEntityList>(responses);
一番変なのは… を使うと鳴くかなと思ったのですがCollectionBase
、とにかく F5 を押してしまいました。驚いたことに、コンパイラ エラーも例外もありませんでした。ウーホー!
ただし、アプリの後半で、 Mapper.Map から返されたonを実行しようとすると、からMyEntityResponse
への型変換について不平を言う例外がスローされました。MyEntity
foreach()
MyEntityList
何が起こったかというと、新しいMyEntityList
コレクションが返されましたが、MyEntityResponse
オブジェクトでいっぱいでした。は??カスタム コレクションはAdd()
メソッドをオーバーライドし、型が type でなければならないことを指定しますMyEntity
。コレクションに間違ったタイプを追加しようとすると爆発することを期待していましたが、CollectionBase
.
私の質問は、マッピングしようとしている 2 つの型が完全に一致し (プロパティからプロパティへ)、AutoMapper で CollectionBase に問題がなかった場合、エンティティをマッピングできなかったのはなぜですか? そして、間違った型をコレクションに押し込むのではなく、なぜ例外をスローしなかったのでしょうか?
編集:私は理由を知っていると思います...非ジェネリックコレクションには、ジェネリックコレクションのように既知のタイプが関連付けられていないためです。
MyEntity
それで、新しい質問...の代わりに使用するように指示するにはどうすればよいMyEntityResponse
ですか?