Frage

Ich habe eine Klasse mit einer einzigen statischen Methode, die Kopien Eigenschaftswerte von einem Objekt zum anderen geschrieben. Es kümmert sich nicht darum, welche Art jedes Objekt ist, nur, dass sie identische Eigenschaften haben. Es tut, was ich brauche, also bin ich Engineering es nicht weiter, aber welche Verbesserungen würden Sie machen?

Hier ist der Code:

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);
        }
    }
}

Ich verwende es wie folgt:

EmployeeDTO dto = GetEmployeeDTO();
Employee employee = new Employee();
ShallowCopy.Copy(dto, employee);
War es hilfreich?

Lösung

Sind Ihre DTOs serializable? Ich würde erwarten, so in diesem Fall:

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

Beachten Sie aber, dass ich mit diesem allgemeinen Ansatz nicht wirklich zustimmen. Ich würde für das Kopieren auf Ihrem DTOs einen starken Vertrag bevorzugen, dass jedes DTO implementiert.

Andere Tipps

  • Ändern Sie Ihre Art Parameternamen mit Namenskonventionen zu erfüllen, zum Beispiel TFrom und TTo oder TSource und tdest (oder TDestination).

  • die meisten Ihrer Arbeit in einem allgemeinen Typ Do statt in nur einer generischen Methode. Das ermöglicht es Ihnen, die Eigenschaften cachen, sowie Typinferenz ermöglicht. Typinferenz ist wichtig, auf dem „TFrom“ Parameter, wie es anonyme Typen verwendet werden, ermöglichen wird.

  • Sie könnten potenziell es schnell machen blendend durch dynamische Code erzeugt die Eigenschaft Kopieren und halten es in einem Delegierten zu tun, die für die „aus“ ist gültig. Oder erzeugen sie potenziell für jeden von / nach Paar, das das tatsächliche Kopieren würde nicht brauchen würde bedeuten, Reflexion überhaupt nutzen zu können! (Vorbereitung der Code wäre ein einmaliger Hit pro Paar Arten, aber hoffentlich würden Sie nicht zu viele Paare haben).

Eine neue Methode, die eine neue Instanz von To erstellt und die Copy() Methode aufgerufen, bevor könnte nützlich sein, zurück.

Wie folgt aus:

public static To Create<From, To>(From from)
    where To : class, new()
    where From : class
{
    var to = new To();
    Copy(from, to);
    return to;
}

Entscheiden Sie, was Sie tun möchten, wenn Objekte von Typen übergeben, die einige Eigenschaften teilen, aber nicht alle. Überprüfen Sie, ob die Existenz der Eigenschaft im From Objekt im To Objekt, bevor Sie versuchen, es ist Wert zu setzen. Tun Sie das „Richtige“, wenn Sie auf eine Eigenschaft kommen, die nicht existiert. Wenn alle öffentlichen Eigenschaften identisch sein müssen, dann müssen Sie überprüfen, ob Sie alle von ihnen auf dem To Objekt festgelegt haben und behandeln den Fall, dass Sie nicht richtig haben.

Ich würde auch vorschlagen, dass Sie möchten Attribute verwenden, um die Eigenschaften zu dekorieren, die kopiert werden müssen und andere ignorieren. Dies würde es ermöglichen Sie hin und her zwischen den beiden verschiedenen Objekten gehen leichter und weiterhin einige öffentliche Eigenschaften beizubehalten, die abgeleitet werden, anstatt auf Ihrem Business-Objekt gespeichert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top