在if语句中重构yield return

时间:2014-08-14 08:14:55

标签: c# refactoring yield

在一个项目中,我有一组验证器对象,Validate yield为每个错误返回ValidationResult。反过来,这些被收集并抛出异常。我从这里偷了这个:Validation: How to inject A Model State wrapper with Ninject?

当需要验证的对象具有需要验证的复杂属性时,我最终会得到这样的笨重代码(我的问题是foreach循环):

public class MembershipValidator
{

    public override IEnumerable<ValidationResult> Validate(Membership entity)
    {
        if (entity == null)
        {
            throw new ArgumentNullException("entity");
        }

        foreach (var result in userValidator.Validate(entity.User))
        {
            yield return result;
        }

    }
}

在这种情况下UserValidator还有几个yield return语句(其中一个在此处显示):

public class UserValidator
{
    public override IEnumerable<ValidationResult> Validate(User entity)
    {
        if (entity == null)
        {
            throw new ArgumentNullException();
        }

        if (entity.BirthDate == DateTime.MinValue)
        {
            yield return new ValidationResult("User", "BirthDate is mandatory");
        }

    }
}

有没有办法在&#34; parent&#34;中编写代码?验证器更简洁?它现在充满了foreach循环。 明确地编写以下代码构建,但不执行:

userValidator.Validate(entity.User);

以下不编译:

return userValidator.Validate(beschouwing.User);

1 个答案:

答案 0 :(得分:0)

只需拆分参数检查(即抛出异常)并在两种方法中产生验证结果:

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
}

您可以使用相同的方法进行成员资格验证。