如何在lambda表达式

时间:2017-01-25 16:04:38

标签: c# visual-studio-2013 lambda

我在Visual Studio 2013中停留了一段时间,所以我为null条件运算符编写了一个实现,如下所示:

public static TResult IfNotNull<TResult, TTarget>(this TTarget target, Func<TTarget, TResult> operation)
    where TResult : class
{
    if (target != null && operation != null)
    {
        try
        {
            return operation(target);
        } 
        catch (NullReferenceException)
        { }
    }

    return default(TResult);
}

我这样做是为了增强代码的可读性,而不是操作员。这消除了类初始化代码中使用的数百个三元运算符,而不是坏代码,但难以阅读。

问题不适用于此功能。它运作良好。问题在于它的用法:

var myValue = myEntity.Property.IfNotNull(p => p.FirstProperty.SecondaryProperty);

FirstProperty为空的情况下,即使我正在处理它,Visual Studio也会报告NullReferenceException。这可能非常烦人,即使在长循环中完成也会令人望而却步。我通常不会获得NullReferenceException例外,但我并不想真正关闭此异常警告。我抓住NullReferenceException(显然空条件运算符不会这样做)的原因是我想避免在复合属性路径的情况下嵌套IfNotNull

我不想使用反射,因为我希望operation的内容是消费者想要的内容(例如,方法,字段,甚至逻辑操作)。

我真的不能等到我们升级到Visual Studio 2017。

(是的,我知道在Visual Studio 2015中可以使用null条件运算符。我们正在升级到2017,因为它是最新版本。)

进一步:在我调试时,Visual Studio会将异常报告为弹出窗口。除非您正在调试,否则这不会在运行时或单元测试中发生。 我有一个catch块,Visual Studio不应该在调试时弹出这个异常。应该抓住它。

更进一步:好吧,我想我知道人们要求的是什么。这不是运行时问题。这是一个调试问题。 Visual Studio在一个lambda表达式中报告抛出的NullReferenceException,该表达式从捕获NullReferenceException的try catch块中调用。 为什么Visual Studio会警告我这一点,以及如何让它停止?这就像我一样简洁。

1 个答案:

答案 0 :(得分:0)

评论太长,因此请在此处发帖以供审核。

使用OP

中提供的示例完成以下单元测试
[TestMethod]
public void _TestNullCoalesceningExtension() {
    var myEntity = new MyEntity 
    {
        Property = new AnotherEntity()
    };
    var myValue = myEntity.Property.IfNotNull(p => p.FirstProperty.SecondaryProperty);
    Assert.IsNull(myValue);
}

public class MyEntity {
    public AnotherEntity Property { get; set; }
}

public class AnotherEntity {
    public YetAnotherClass FirstProperty { get; set; }
}

public class YetAnotherClass {
    public object SecondaryProperty { get; set; }
}

在调试或运行它时,没有抛出任何异常。