Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重构在if语句中产生返回_C#_Refactoring_Yield - Fatal编程技术网

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
}