所以我有一个布尔方法,用于验证命令是否有效。这在引擎内部使用,在引擎中验证进程是否可以继续。这是验证方法:
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#或一般我可以做到避免这个。
答案 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
}
}
希望有所帮助:)