2

私は古いアプリケーション (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への型変換について不平を言う例外がスローされました。MyEntityforeach()MyEntityList

何が起こったかというと、新しいMyEntityListコレクションが返されましたが、MyEntityResponseオブジェクトでいっぱいでした。は??カスタム コレクションはAdd()メソッドをオーバーライドし、型が type でなければならないことを指定しますMyEntity。コレクションに間違ったタイプを追加しようとすると爆発することを期待していましたが、CollectionBase.

私の質問は、マッピングしようとしている 2 つの型が完全に一致し (プロパティからプロパティへ)、AutoMapper で CollectionBase に問題がなかった場合、エンティティをマッピングできなかったのはなぜですか? そして、間違った型をコレクションに押し込むのではなく、なぜ例外をスローしなかったのでしょうか?


編集:私は理由を知っていると思います...非ジェネリックコレクションには、ジェネリックコレクションのように既知のタイプが関連付けられていないためです。

MyEntityそれで、新しい質問...の代わりに使用するように指示するにはどうすればよいMyEntityResponseですか?

4

1 に答える 1

1

私は自分の答えを見つけたと思います: http://automapper.codeplex.com/wikipage?title=Lists%20and%20Arrays

AutoMapper はマップしようとしている型を「推測」できないため、非ジェネリックの列挙型については、マップされていない割り当て可能な型のみがサポートされます。上記の例に示すように、リストの種類を明示的に構成する必要はなく、メンバーの種類のみを構成します。

リリース 0.2.0 の時点では、カスタムの宛先コレクション タイプはサポートされていません。

于 2012-07-09T22:25:44.700 に答える