FluentValidations Получить имя свойства из RuleBuilderOptions - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь создать пользовательский Когда расширения, чтобы проверить, есть ли изменения в моей сущности. Но у меня возникают проблемы при получении имени свойства, которое мне нужно, когда проверяется экземпляр.

public static bool WhenHasChanged<T, TProperty>(this IRuleBuilderOptions<T, TProperty> rule)
{
    //I need to get the PropertyValidatorContext from the rule
    PropertyValidatorContext context;
    var instance = (IChangeTrackingObject)context.Instance;

    if (false == instance.GetChangedProperties().ContainsKey(context.PropertyName))
    {
        return true;
    }

    var oldValue = instance.GetChangedProperties().Get(context.PropertyName).OldValue;
    var newValue = context.PropertyValue;

    return (null == oldValue) ? null == newValue : oldValue.Equals(newValue);
}

Мне нужно получить валидированное PropertyName и проверяемый экземпляр, обычно они лежат в пределах PropertyValidatorContext. Есть ли способ получить PropertyValidatorContext из правила?

1 Ответ

0 голосов
/ 10 мая 2018

Я закончил тем, что создал обязательные расширения вместо, поэтому у меня был доступ к контексту валидатора свойства:

private static Func<T, TProperty, PropertyValidatorContext, bool> MustWhenChangedPredicate<T, TProperty>(Func<T, TProperty, PropertyValidatorContext, bool> predicate)
{
    return (t, p, context) =>
    {
        var instance = (IChangeTrackingObject)context.Instance;

        //The type name always prefixes the property
        var propertyName = context.PropertyName.Split(new[] { '.' }, 2).Skip(1).First();

        if (false == instance.GetChangedProperties().ContainsKey(propertyName))
        {
            return true;
        }

        var oldValue = instance.GetChangedProperties().Get(propertyName).OldValue;
        var newValue = context.PropertyValue;

        if (oldValue == null && newValue == null)
        {
            return true;
        }

        if ((oldValue != null && oldValue.Equals(newValue)) ||
               (newValue != null && newValue.Equals(oldValue)))
        {
            return true;
        }

        return predicate(t, p, context);
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...