C# 重构在if语句中产生返回
在一个项目中,我有一组验证器对象,其中的C# 重构在if语句中产生返回,c#,refactoring,yield,C#,Refactoring,Yield,在一个项目中,我有一组验证器对象,其中的Validateyield为每个错误返回一个ValidationResult。然后,收集这些数据并引发异常。我从这里偷了这个: 当一个需要验证的对象有复杂的属性也需要验证时,我会得到这样的笨拙代码(我的问题是foreach循环): 有没有办法在“父”验证器中编写更简洁的代码?它现在充满了foreach循环。 简单地编写以下代码生成,但不执行: userValidator.Validate(entity.User); 以下内容无法编译: return us
Validate
yield为每个错误返回一个ValidationResult
。然后,收集这些数据并引发异常。我从这里偷了这个:
当一个需要验证的对象有复杂的属性也需要验证时,我会得到这样的笨拙代码(我的问题是foreach
循环):
有没有办法在“父”验证器中编写更简洁的代码?它现在充满了foreach
循环。
简单地编写以下代码生成,但不执行:
userValidator.Validate(entity.User);
以下内容无法编译:
return userValidator.Validate(beschouwing.User);
只需拆分参数检查(即抛出异常)并通过两种方法生成验证结果:
public override IEnumerable<ValidationResult> Validate(User entity)
{
if (entity == null)
throw new ArgumentNullException();
return UserValidationIterator(entity);
}
private IEnumerable<ValidationResult> UserValidationIterator(User user)
{
if (entity.BirthDate == DateTime.MinValue)
yield return new ValidationResult("User", "BirthDate is mandatory");
// other yields here
}
公共覆盖IEnumerable验证(用户实体)
{
if(实体==null)
抛出新ArgumentNullException();
返回UserValidationIterator(实体);
}
私有IEnumerable UserValidationIterator(用户)
{
if(entity.BirthDate==DateTime.MinValue)
返回新的ValidationResult(“用户”,“出生日期是必需的”);
//这里的其他产量
}
您可以使用相同的方法进行成员身份验证。为什么不能返回
IEnumerable
?即返回userValidator.Validate(entity.User)代码>@SergeyBerezovskiy查看更新的问题,抱歉我没有说清楚。它给了我以下错误:无法从迭代器返回值。使用yield-return语句返回一个值,或使用yield-break结束迭代。
还是我遗漏了什么?您能给出带有“parent”foreach的示例代码吗?顺便说一句,重构问题通常在@SergeyBerezovskiy更新问题上提出。谢谢你提供的信息,我下次会去那里。但是这并不能消除成员资格验证程序中的foreach
循环,是吗?(为了清晰起见,我将类添加到了两个验证器中)。
return userValidator.Validate(beschouwing.User);
public override IEnumerable<ValidationResult> Validate(User entity)
{
if (entity == null)
throw new ArgumentNullException();
return UserValidationIterator(entity);
}
private IEnumerable<ValidationResult> UserValidationIterator(User user)
{
if (entity.BirthDate == DateTime.MinValue)
yield return new ValidationResult("User", "BirthDate is mandatory");
// other yields here
}