2016-07-03 10 views
0

Ich arbeite an einer Methode, die dynamisch Variablen des gleichen Namens und Typs kopiert (nicht unbedingt aus der gleichen Klasse). Ich möchte nicht blind alles kopieren, weil ein Administrator der Website diese Fähigkeit besitzt, während ein Benutzer dies nicht tut. Zum Beispiel sind hier einige der Ereignisobjekte:Array/Liste der Variablen an Methode übergeben

public class Event 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public DateTime EventDate { get; set; } 
    public int Organization { get; set; } 
    public string Location { get; set; } 
    public int SpotsAvailable { get; set; } 
    public int CreatedBy { get; set; } 
    public DateTime CreatedDate { get; set; } 
    public int ModifiedBy { get; set; } 
    public DateTime ModifiedDate { get; set; } 
    public int ApprovedBy { get; set; } 
    public DateTime ApprovedDate { get; set; } 
    public bool AutomaticallyApproved { get; set; } 
} 

Was will ich eine generische Methode zu tun haben, die nur die Objekte klont Ich möchte, eine Reihe von Variablennamen zu ignorieren, die ich will leer gelassen werden oder der Standardwert der Eigenschaft Based off of this post Ich habe eine Methode erstellt, die alle Felder kopiert, die denselben Namen haben und denselben Eigenschaftstyp haben, und alles funktioniert gut. Jetzt möchte ich eine Zeile hinzufügen (if (ignoreObjects.Contains (srcProp.Name))), die, wenn das Array ignorieren überprüfen die aktuelle Eigenschaft enthält:

public void Clone(ref object destination, object source, object[] ignoreObjects) 
    { 
     // Getting the Types of the objects 
     Type typeDest = destination.GetType(); 
     Type typeSrc = source.GetType(); 

     // Iterate the Properties of the source instance and 
     // populate them from their desination counterparts 
     PropertyInfo[] srcProperties = typeSrc.GetProperties(); 
     foreach (PropertyInfo srcProp in srcProperties) 
     { 
      if(ignoreObjects.Contains(srcProp.Name)) 
      { 
       continue; 
      } 
      PropertyInfo targetProperty = typeDest.GetProperty(srcProp.Name); 
      if (targetProperty == null) 
      { 
       continue; 
      } 
      if (!targetProperty.CanWrite) 
      { 
       continue; 
      } 
      if (targetProperty.GetSetMethod(true) != null && targetProperty.GetSetMethod(true).IsPrivate) 
      { 
       continue; 
      } 
      if ((targetProperty.GetSetMethod().Attributes & MethodAttributes.Static) != 0) 
      { 
       continue; 
      } 
      if (!targetProperty.PropertyType.IsAssignableFrom(srcProp.PropertyType)) 
      { 
       continue; 
      } 

      targetProperty.SetValue(destination, srcProp.GetValue(source, null), null); 
     } 
    } 

Ich würde idealerweise die oben beschriebene Methode wie folgt aufrufen:

Hier würden alle Ereignisinformationen von "eventInfo" in "newEvent" kopiert, wobei die Felder ApprovedBy, ApprovedDate, Organization und SpotsAvailable ignoriert werden.

Ist es möglich, eine Liste/ein Array von Variablen an ein ignoriertes Array zu senden? Ich kann sicherlich einen "nameof" vor jeder Variable hinzufügen, um ein String-Array zu erstellen (zB: nameof (eventInfo.ApprovedBy)), aber ich würde lieber nur auf die Klasseneigenschaften selbst verweisen, um den Code zu reduzieren.

Ich habe früher AutoMapper verwendet, möchte aber herausfinden, ob dies ohne Drittanbieter-Tools möglich ist.

Antwort

0

Sie müssen Objekt verwenden, um Eigenschaftsname oder PropertyInfo zu übertragen, können Sie nicht übergeben Eigenschaft Wert dann erkennen, welche Eigenschaft es ist. Sie sollten params Schlüsselwort:

public void Clone(object destination, object source, params String[] ignoreObjects) 

Und rufen Sie die Methode:

Clone(newEvent, eventInfo, property1, property2, property3, ...); 

Sie das Objekt übergeben, dann müssen Sie nicht ref Stichwort.

Verwandte Themen