我正在研究一种使用反射比较两个对象的方法。对象类型是从实体框架创建的对象。当我使用GetProperties()时,我得到了EntityCollection和EntityReference属性。我只想要属于该对象的属性,而不是任何相关属性或外键引用。
我尝试了以下How to get all names of properties in an Entity?。
我考虑过传递一组属性进行比较,但我不想为每种对象类型输入它们。我甚至对那些不使用反射的建议持开放态度。
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;
}
答案 0 :(得分:4)
使用来自@Eranga和https://stackoverflow.com/a/5381986/1129035的建议,我能够找到一个可行的解决方案。
由于根对象中的某些属性是GenericType,因此需要有两个不同的if语句。仅当当前属性是EntityCollection时才跳过它。
public bool CompareEntities<T>(T oldEntity, T newEntity)
{
bool same = true;
PropertyInfo[] properties = oldEntity.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance)
.Where(pi => !(pi.PropertyType.IsSubclassOf(typeof(EntityObject)))
&& !(pi.PropertyType.IsSubclassOf(typeof(EntityReference)))
).ToArray();
foreach (PropertyInfo property in properties)
{
if (property.PropertyType.IsGenericType)
{
if (property.PropertyType.GetGenericTypeDefinition() == typeof(EntityCollection<>))
{
continue;
}
}
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;
}
答案 1 :(得分:2)
尝试过滤掉EntityObject
类型和EntityCollection
属性。
var properties = oldEntity.GetType().GetProperties().
Where(pi => !(pi.PropertyType.IsSubclassOf(typeof(EntityObject))
|| pi.PropertyType.IsSubclassOf(typeof(EntityCollection));
答案 2 :(得分:2)
让自己轻松一点,而不是
PropertyInfo [] properties = oldEntity.GetType()。GetProperties(pi =&gt; pi.PropertyType.NameSpace ==&#34; System&#34;)。ToArray();