.NETのオブジェクトコピーアプローチ:自動マッパー、エミットマッパー、暗黙の操作、プロパティコピー
-
27-09-2019 - |
質問
誰かが.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
ここからエミットとオートマッパーを得ることができます:
解決
T4を使用して、プロパティコピーコードを生成するクラスを生成することもできます。
良い:可能な限り速く実行する:T4の「コーディング」:すべてを一度にコンパイルできるビルドスクリプトを作成する
他のヒント
オブジェクトインスタンスをコピーするためにクローンメソッドをオーバーライドしてみましたか?これにより、このような新しい学生オブジェクトを取得します。
for (int i = 0; i < 1000000; i++)
{
StudentDTO itemT = _student.Clone();
}
このアプローチは、オブジェクトを新しいオブジェクトにコピーする最も簡単な方法であると思いますが、スピードテストを実行して、提案する方法に対してどれだけうまく機能するかを確認していません。
クローンは、2つの異なるオブジェクトタイプからコピーするためではなく、同じタイプをコピーするためのもので、このスコープには使用できません。
所属していません StackOverflow