Erhalten entity-Objekt das property-Namen ohne entitycollection und entityreference
Arbeite ich an einer Methode vergleicht zwei Objekte mit der spiegelung. Die Objekttypen sind Objekte, die aus entity framework. Wenn ich GetProperties() ich bin immer EntityCollection-und EntityReference-Eigenschaften. Ich will nur die Eigenschaften, die zum Objekt gehören und nicht alle zugehörigen Eigenschaften oder Verweise von fremden Schlüsseln.
Ich habe versucht, die folgenden Wie alle Namen von Eigenschaften in einer Person?.
Ich dachte an ein array übergeben von Eigenschaften zu vergleichen, aber ich will nicht zu haben, geben Sie Sie in für jeden Objekt-Typ. Ich bin offen für einige Vorschläge, auch diejenigen, die nicht mit Reflexion.
public bool CompareEntities<T>(T oldEntity, T newEntity)
{
bool same = true;
PropertyInfo[] properties = oldEntity.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
var oldValue = property.GetValue(oldEntity, null);
var newValue = property.GetValue(newEntity, null);
if (oldValue != null && newValue != null)
{
if (!oldValue.Equals(newValue))
{
same = false;
break;
}
}
else if ((oldValue == null && newValue != null) || (oldValue != null && newValue == null))
{
same = false;
break;
}
}
return same;
}
- Sind diese Entitäten POCOs oder abgeleitet aus
EntityObject
? - abgeleitet von EntityObject
Du musst angemeldet sein, um einen Kommentar abzugeben.
Über die Vorschläge von @Eranga und https://stackoverflow.com/a/5381986/1129035 ich war in der Lage zu kommen mit einer praktikablen Lösung.
Da einige der Eigenschaften, die im root-Objekt sind ein GenericType muss es zwei verschiedene if-Anweisungen. Nur wenn die current-Eigenschaft ist ein EntityCollection überspringen.
Versuchen herausfiltern
EntityObject
Art undEntityCollection
Eigenschaften.PropertyInfo[] properties = oldEntity.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance).Where(pi => !(pi.PropertyType.IsSubclassOf(typeof(EntityObject))) && !(pi.PropertyType.IsSubclassOf(typeof(EntityReference)))).ToArray();
Jetzt nur EntityCollections ausgeschlossen werden müssen.Where
Zustand heraus zu filternEntityCollection
.machen Sie es sich einfach und tun diese statt
PropertyInfo[] properties = oldEntity.GetType().GetProperties(pi=> pi.Art der Unterkunft.NameSpace=="System").ToArray();