获取实体对象的属性名称,不包括entitycollection和entityreference

时间:2012-01-04 03:07:17

标签: c#-4.0 entity-framework-4

我正在研究一种使用反射比较两个对象的方法。对象类型是从实体框架创建的对象。当我使用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;
}

3 个答案:

答案 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();