У меня есть scneario, в котором я хочу использовать отражение для проверки, используя FluentValidation. Коснуться, как это:Как использовать отражение в FluentValidation?
public class FooValidator : AbstractValidator<Foo>
{
public FooValidator(Foo obj)
{
// Iterate properties using reflection
var properties = ReflectionHelper.GetShallowPropertiesInfo(obj);
foreach (var prop in properties)
{
// Create rule for each property, based on some data coming from other service...
//RuleFor(o => o.Description).NotEmpty().When(o => // this works fine when foo.Description is null
RuleFor(o => o.GetType().GetProperty(prop.Name)).NotEmpty().When(o =>
{
return true; // do other stuff...
});
}
}
}
Вызов к ReflectionHelper.GetShallowPropertiesInfo(obj)
возвращает «мелкие» свойства объекта. Затем для каждого свойства создаю правило. Это мой код для просмотра свойств объекта:
public static class ReflectionHelper
{
public static IEnumerable<PropertyInfo> GetShallowPropertiesInfo<T>(T o) where T : class
{
var type = typeof(T);
var properties =
from pi in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
where pi.PropertyType.Module.ScopeName == "CommonLanguageRuntimeLibrary"
&& !(pi.PropertyType.IsGenericType && pi.PropertyType.GetGenericTypeDefinition() == typeof(ICollection<>))
select pi;
return properties;
}
}
Этот код компиляции и может быть выполнена
IValidator<Foo> validator = new FooValidator(foo);
var results = validator.Validate(foo);
Но он не работает должным образом (проверка никогда не подведет). Есть ли способ достичь этого?
Примечания: код Demo можно найти Int Github в FluentValidationReflection