5

あるオブジェクトから別のオブジェクトにプロパティ値をコピーする単一の静的メソッドを持つクラスを作成しました。各オブジェクトがどのタイプであるかは気にせず、それらが同一のプロパティを持っているだけです。それは私が必要とすることをするので、それ以上のエンジニアリングはしませんが、どのような改善を行いますか?

コードは次のとおりです。

public class ShallowCopy
{
    public static void Copy<From, To>(From from, To to)
        where To : class
        where From : class
    {
        Type toType = to.GetType();
        foreach (var propertyInfo in from.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance))
        {
            toType.GetProperty(propertyInfo.Name).SetValue(to, propertyInfo.GetValue(from, null), null);
        }
    }
}

私は次のように使用しています:

EmployeeDTO dto = GetEmployeeDTO();
Employee employee = new Employee();
ShallowCopy.Copy(dto, employee);
4

4 に答える 4

6

DTO はシリアライズ可能ですか? その場合、次のようになります。

MemberInfo[] sm = FormatterServices.GetSerializableMembers(typeof(From));
object[] data = FormatterServices.GetObjectData(from, sm);
FormatterServices.PopulateObjectMembers(to, sm, data);

しかし、私はこの一般的なアプローチにあまり同意しないことに注意してください。各 DTO が実装する DTO をコピーするための強力な契約を希望します。

于 2009-01-22T17:09:43.033 に答える
4
  • TFrom と TTo、または TSource と TDest (または TDestination) などの命名規則に準拠するように型パラメータ名を変更します。

  • ジェネリック メソッドだけではなく、ほとんどの作業をジェネリック型で行います。これにより、プロパティをキャッシュするだけでなく、型の推論も可能になります。匿名型を使用できるようにするため、「TFrom」パラメーターでは型の推論が重要です。

  • プロパティのコピーを実行するコードを動的に生成し、「from」タイプに有効なデリゲートに保持することで、非常に高速になる可能性があります。または、すべての from/to ペアに対してそれを生成する可能性があります。これは、実際のコピーでリフレクションを使用する必要がまったくないことを意味します! (コードの準備は、型のペアごとに 1 回のヒットになりますが、ペアが多すぎないことを願っています。)

于 2009-01-22T17:22:25.753 に答える
2

の新しいインスタンスを作成し、メソッドを返す前にTo呼び出した新しいメソッドCopy()が役立つ場合があります。

このような:

public static To Create<From, To>(From from)
    where To : class, new()
    where From : class
{
    var to = new To();
    Copy(from, to);
    return to;
}
于 2009-01-22T17:07:17.377 に答える
1

すべてではなく一部のプロパティを共有する型のオブジェクトが渡された場合の処理​​を決定します。値を設定する前に、Fromオブジェクト内のオブジェクト内のプロパティの存在を確認してください。To存在しない物件に来たら「正しいこと」をしましょう。すべてのパブリック プロパティを同一にする必要がある場合は、それらすべてをToオブジェクトに設定したかどうかを確認し、適切に設定していない場合に対処する必要があります。

また、属性を使用して、コピーする必要があるプロパティを装飾し、他のプロパティを無視することもお勧めします。これにより、2 つの異なるオブジェクト間をより簡単に行き来し、ビジネス オブジェクトに格納されるのではなく、派生したパブリック プロパティを維持し続けることができます。

于 2009-01-22T17:14:28.110 に答える