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.