Получить имена свойств объекта сущности, за исключением entitycollection и entityreference - PullRequest
2 голосов
/ 04 января 2012

Я работаю над методом, который сравнивает два объекта, используя отражение. Типы объектов - это объекты, созданные из структуры сущностей. Когда я использую GetProperties (), я получаю свойства EntityCollection и EntityReference. Мне нужны только те свойства, которые принадлежат объекту, а не какие-либо связанные свойства или ссылки из внешних ключей.

Я пробовал следующее Как получить все имена свойств в сущности? .

Я думал о передаче массива свойств для сравнения, но я не хочу вводить их для каждого типа объекта. Я открыт для некоторых предложений, даже тех, которые не используют рефлексию.

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 ]

4 голосов
/ 08 января 2012

Используя предложения @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;
}
2 голосов
/ 03 сентября 2015

упростите для себя и сделайте это вместо этого

PropertyInfo [] properties = oldEntity.GetType (). GetProperties (pi => pi.PropertyType.NameSpace == "System"). ToArray ();

2 голосов
/ 04 января 2012

Попробуйте отфильтровать EntityObject тип и EntityCollection свойства.

var properties = oldEntity.GetType().GetProperties().
                   Where(pi => !(pi.PropertyType.IsSubclassOf(typeof(EntityObject))
                   || pi.PropertyType.IsSubclassOf(typeof(EntityCollection));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...