.NETのオブジェクトコピーアプローチ:自動マッパー、エミットマッパー、暗黙の操作、プロパティコピー

StackOverflow https://stackoverflow.com/questions/3457657

質問

誰かが.NETでこれを行う方法をこれ以上知っている場合、そしてそれについてのあなたの意見は何ですか?どのアプローチを選択し、その理由は?

.NETのオブジェクトコピーのさまざまな方法のテストは次のとおりです。

この元のスレッドに関連するテスト: C#で同じプロパティ名でクラスXからクラスYへの値をコピーする方法は?

だから、ここで、あなたはそれを自分で実行することができます:

static void Main(string[] args)
    {
        Student _student = new Student();
        _student.Id = 1;
        _student.Name = "Timmmmmmmmaaaahhhh";
        _student.Courses = new List<int>();
        _student.Courses.Add(101);
        _student.Courses.Add(121);

        Stopwatch sw = new Stopwatch();

        Mapper.CreateMap<Student, StudentDTO>();            

        StartTest(sw, "Auto Mapper");

        for (int i = 0; i < 1000000; i++)
        {
            StudentDTO dto = Mapper.Map<Student, StudentDTO>(_student);
        }

        StopTest(sw);

        StartTest(sw, "Implicit Operator");

        for (int i = 0; i < 1000000; i++)
        {
            StudentDTO itemT = _student;
        }

        StopTest(sw);

        StartTest(sw, "Property Copy");

        for (int i = 0; i < 1000000; i++)
        {

            StudentDTO itemT = new StudentDTO
            {
                Id = _student.Id,
                Name = _student.Name,
            };

            itemT.Courses = new List<int>();
            foreach (var course in _student.Courses)
            {
                itemT.Courses.Add(course);
            }
        }

        StopTest(sw);

        StartTest(sw, "Emit Mapper");

        ObjectsMapper<Student, StudentDTO> emitMapper = ObjectMapperManager.DefaultInstance.GetMapper<Student, StudentDTO>();

        for (int i = 0; i < 1000000; i++)
        {
            StudentDTO itemT = emitMapper.Map(_student);
        }

        StopTest(sw);
    }

私のPCで結果をテストします:

テストオートマッパー:22322ミリ秒

暗黙的オペレーターをテスト:310ミリ秒

テストプロパティコピー:250ミリ秒

テストエミットマッパー:281 ms

ここからエミットとオートマッパーを得ることができます:

http://emitmapper.codeplex.com/

http://automapper.codeplex.com/

役に立ちましたか?

解決

T4を使用して、プロパティコピーコードを生成するクラスを生成することもできます。

良い:可能な限り速く実行する:T4の「コーディング」:すべてを一度にコンパイルできるビルドスクリプトを作成する

他のヒント

オブジェクトインスタンスをコピーするためにクローンメソッドをオーバーライドしてみましたか?これにより、このような新しい学生オブジェクトを取得します。

for (int i = 0; i < 1000000; i++) 
{ 
     StudentDTO itemT = _student.Clone(); 
}

このアプローチは、オブジェクトを新しいオブジェクトにコピーする最も簡単な方法であると思いますが、スピードテストを実行して、提案する方法に対してどれだけうまく機能するかを確認していません。

クローンは、2つの異なるオブジェクトタイプからコピーするためではなく、同じタイプをコピーするためのもので、このスコープには使用できません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top