只要十步,你就可以应用表达式树来优化动态调用(二)( 六 )

< Count; i++){// test 1{var input = new CreateClaptrapInput{NickName = "newbe36524"};var (isOk, errorMessage) = Validate(input);isOk.Should().BeFalse();errorMessage.Should().Be("missing Name");}// test 2{var input = new CreateClaptrapInput{Name = "1",NickName = "newbe36524"};var (isOk, errorMessage) = Validate(input);isOk.Should().BeFalse();errorMessage.Should().Be("Length of Name should be great than 3");}// test 3{var input = new CreateClaptrapInput{Name = "yueluo is the only one dalao",NickName = "newbe36524"};var (isOk, errorMessage) = Validate(input);isOk.Should().BeTrue();errorMessage.Should().BeNullOrEmpty();}}}public ValidateResult Validate(CreateClaptrapInput input){Debug.Assert(_factory != null, nameof(_factory) + " != null");var validator = _factory.GetValidator(typeof(CreateClaptrapInput));return validator.Invoke(input);}public class CreateClaptrapInput{[Required] [MinLength(3)] public string Name { get; set; }[Required] [MinLength(3)] public string NickName { get; set; }}public struct ValidateResult{public bool IsOk { get; set; }public string ErrorMessage { get; set; }public void Deconstruct(out bool isOk, out string errorMessage){isOk = IsOk;errorMessage = ErrorMessage;}public static ValidateResult Ok(){return new ValidateResult{IsOk = true};}public static ValidateResult Error(string errorMessage){return new ValidateResult{IsOk = false,ErrorMessage = errorMessage};}}private class ValidatorModule : Module{protected override void Load(ContainerBuilder builder){base.Load(builder);builder.RegisterType().As().SingleInstance();builder.RegisterType().As().SingleInstance();builder.RegisterType().As().SingleInstance();}}public interface IValidatorFactory{Func GetValidator(Type type);}public interface IPropertyValidatorFactory{IEnumerable CreateExpression(CreatePropertyValidatorInput input);}public abstract class PropertyValidatorFactoryBase : IPropertyValidatorFactory{public virtual IEnumerable CreateExpression(CreatePropertyValidatorInput input){if (input.PropertyInfo.PropertyType != typeof(TValue)){return Enumerable.Empty();}var expressionCore = CreateExpressionCore(input);return expressionCore;}protected abstract IEnumerable CreateExpressionCore(CreatePropertyValidatorInput input);protected Expression CreateValidateExpression(CreatePropertyValidatorInput input,Expression validateFuncExpression){var propertyInfo = input.PropertyInfo;var isOkProperty = typeof(ValidateResult).GetProperty(nameof(ValidateResult.IsOk));Debug.Assert(isOkProperty != null, nameof(isOkProperty) + " != null");var convertedExp = Expression.Convert(input.InputExpression, input.InputType);var propExp = Expression.Property(convertedExp, propertyInfo);var nameExp = Expression.Constant(propertyInfo.Name);var requiredMethodExp = Expression.Invoke(validateFuncExpression,nameExp,propExp);var assignExp = Expression.Assign(input.ResultExpression, requiredMethodExp);var resultIsOkPropertyExp = Expression.Property(input.ResultExpression, isOkProperty);var conditionExp = Expression.IsFalse(resultIsOkPropertyExp);var ifThenExp =Expression.IfThen(conditionExp,Expression.Return(input.ReturnLabel, input.ResultExpression));var re = Expression.Block(new[] {input.ResultExpression},assignExp,ifThenExp);return re;}}public class StringRequiredPropertyValidatorFactory : PropertyValidatorFactoryBase{private static Expression


推荐阅读