返回调试信息的好方法,而不是使用大量的if-else

时间:2016-09-06 18:02:11

标签: c# if-statement

所以我有一个布尔方法,用于验证命令是否有效。这在引擎内部使用,在引擎中验证进程是否可以继续。这是验证方法:

private bool CommandIsValid(WC command)
        {
            if (command.Address == null ||
                command.UserId < 0 ||
                String.IsNullOrEmpty(command.CurrencyCode) ||
                command.Amount < .01m ||
                command.Address.PrimitiveAddress == null ||
                String.IsNullOrEmpty(command.Address.Source) ||
                String.IsNullOrEmpty(command.Address.PrimitiveAddress.City) ||
                String.IsNullOrEmpty(command.Address.PrimitiveAddress.Country) ||
                String.IsNullOrEmpty(command.Address.PrimitiveAddress.FirstName) ||
                String.IsNullOrEmpty(command.Address.PrimitiveAddress.LastName) ||
                String.IsNullOrEmpty(command.Address.PrimitiveAddress.Region) ||
                command.Address.Created <= DateTime.MinValue)
            {
                return false;
            }
            return true;
        }

在这里我的方法中调用了这个:

if (!CommandIsValid(cmd))
{
    _logger.Debug("Invalid command);
}

问题在于我希望获得有关验证失败的信息。最好的解决方案将有一个没有通过的验证列表,所以我可以在我的日志调试器中传递它。显然我可以使用一堆if-else语句来做到这一点,但它似乎很草率,因为有一堆if else语句似乎非常糟糕的风格,我想知道是否有任何方式在c#或一般我可以做到避免这个。

3 个答案:

答案 0 :(得分:3)

您是否熟悉DataAnnotations并且它是关联的Validator类?

这需要修改你的对象。

handleButton

然后你就像这样使用它:

public PrimitiveAddress
{
[Required]
public string City {get;set;}
}

如果你有一个基本命令类,你可以用更通用的方式添加它。您可以创建自己的验证属性,对任何复杂的事物使用IValidatableObject,自定义错误消息

var context = new ValidationContext(command.Address.PrimitiveAddress);
var results = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(recipe, context, results);

if (!isValid)
{
    foreach (var validationResult in results)
    {
        Console.WriteLine(validationResult.ErrorMessage);
    }
}

答案 1 :(得分:0)

不是返回bool,而是返回bool个值的容器,其中第一个是整体状态False / True,然后每个都反映上述条件。如果第一个元素为False,则检查哪个条件(索引)为false。看起来它的大小是固定的,你可能只是对序列达成一致。

这样的事情:

List<bool> YourFunction(YourDebuggerThing Input)
{
    List<bool> Result = new List<bool>();

    if (Input.Condition1 == false || Input.Condition2 == false || Input.Condition3 == false || Input.Condition4 == false || Input.Condition5 == false)
        Result.Add(false); // first element is always the overall status

    if(Input.Condition1 == false) Result.Add(false); else Result.Add(true); // element 2 is condition 1
    if(Input.Condition2 == false) Result.Add(false); else Result.Add(true); // element 3 is condition 2
    // ..
    // ConditionN

    return Result;
}

答案 2 :(得分:0)

一个想法可能是在课程的Get / Set方法中实现您的检查。属性,使用自定义异常。如;

public class PrimitiveAddresses
{
    private string _city;
    public string City
    {
        get
        {
            if(_city != null) {return _city;}
            else {throw new CommandInvalidException("No valid city provided");}                 
        }
        set
        {
            _city = value;
        }

    }

}

public class CommandInvalidException: Exception
{
    public CommandInvalidException(string message)
    : base(message)
    {
    }
}

然后在实现过程中,使用try / catch来处理特定的错误;

public void foo()
{
    try
    {
        if (String.IsNullOrEmpty(command.Address.PrimitiveAddress.City)){} // Ect
    }
    catch (CommandInvalidException e)
    {
        Console.WriteLine("Command invalid due to " + e.message);
        // Or any other way you want to deal with the missing data
    }
}

希望有所帮助:)