在c#中有办法分解多重检查函数吗?

本文关键字:检查 函数 分解 | 更新日期: 2023-09-27 18:09:56

假设我有一个类,它为一个进程实现了许多检查方法。为了验证这个过程,我需要执行类中所有可用的检查。如何分解验证方法而不让代码看起来太脏?

的例子:

public class VerificationMethods {
    public void CheckDuplicate() {
    }

    public void CheckTitle() {
    }
    // a hundred methods
   public void Validate(){
       CheckDuplicate()
       CheckTitle()
       // a hundred more methods
   }
}

是否有更好的方法来设计这个验证过程?

在c#中有办法分解多重检查函数吗?

反思拯救!但它也会变脏:

[Validation(Order = 1)]
public void CheckDuplicate(...)
[Validation(Order = 3)]
public void CheckTitle(...)
[Validation(Order = 2)]
public void CheckSubtitle(...)

然后,您需要提取所有带有ValidationAttribute注释的方法,按Order排序,并依次应用于您正在验证的任何数据。

假设您对验证方法有一个名称约定,并在方法之间使用一些结果容器(在我的示例中是bool)。所以,你会得到这样的内容:

public class Test
{        
    public bool FirstValidation(bool value)
    {
        return value;
    }
    public bool SecondValidation(bool value)
    {
        return value;
    }
    public bool Validate()
    {
        return _validate(true);
    }
    private static Func<bool, bool> _validate;        
    public Test()
    {
        /*
        * You can easily change bool to some other type
        */
        _validate = ChainBuilderHelper.BuildValidationChain<bool>(this, method => method.Name.EndsWith("Validation"), b => !b);
    }        
}
public static class ChainBuilderHelper
{        
    public static Func<T, T> BuildValidationChain<T>(object obj, Func<MethodInfo, bool> methodSelector, Func<T, bool> exitCriteria)
    {
        return obj.GetType().GetMethods()
            .Where(methodSelector)
            .Select(o => Delegate.CreateDelegate(typeof(Func<T, T>), obj, o))
            .Cast<Func<T, T>>()
            .Aggregate((func, func1) => Compose(func, b => !exitCriteria(b) ? b : func1(b)));
    }        
    private static Func<TX, TZ> Compose<TX, TY, TZ>(Func<TX, TY> f, Func<TY, TZ> g)
    {
        return x => g(f(x));
    }
}

用法:

var instance = new Test();
var result = instance.Validate();