更好(清晰)的方式来执行运行时检查而不添加样板?

时间:2015-08-25 18:56:07

标签: c# .net validation exception code-contracts

我有这段代码消耗了太多的垂直空间而且它太冗长了。

    if (property == null)
    {
        throw new XamlParseException($"Cannot find a property named \"{Name}\" in the type {underlyingType}");
    }

是否有等效的方法,但更清晰,更紧凑

形状的东西  ThrowIfNull<XamlParseException>(message)

2 个答案:

答案 0 :(得分:2)

您始终可以创建扩展方法:

public static class ClassContracts {
   public static void ThrowIfNull(this Object item)
   {
       if(item == null) throw new XamlParseException("Your message here", null); 
   }

}

通过这种方式,您占用的空间更少,这就是您所说的,并且您可以在需要时反复使用代码。我有一个这样的库用于测试空值等。我喜欢这样做,而不是Code Contracts,因为这需要二进制重写器,并且根据你的环境,你的构建系统(如果你有的话)可能不支持这样做。最终,Code Contracts不仅仅是这个,但是在紧要关头,这提供了一种快速简洁的方法,可以在代码中轻松检查空值和其他条件,因为您可以创建其他类似的:

 public static void CheckForCondition <T>(this T item, Predicate<T> p, Func<Your_Exception_Type> createException) 
{
    if(p(item)){throw createException();}
}

使用此基本方法,您可以创建其他方法并创建重载等,具有谓词或已创建的异常方法。

    public static void CheckForNullCondition<T>(this T item)
    {
        item.CheckForCondition(x => x == null,
            () => new Exception("Item is null"));
    }

Extension Methods

答案 1 :(得分:0)

我不知道这样的方法,但你可以自己创建它,或者只是将消息移动到资源文件/内部常量(当然,如果它占用的空间是这样的话)。

扩展方法也是可行的选择,如果它可以接受(我的意思是PropertyInfo或任何其他类型的扩展名。)