在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
}
}
是否有更好的方法来设计这个验证过程?
反思拯救!但它也会变脏:
[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();