[英]How to prevent Exception from within a lambda expression
我在Visual Studio 2013中停留了一段时间,所以我为实现以下条件的空条件运算符编写了一个替代名:
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
为null的情况下,即使我正在处理,Visual Studio也会报告NullReferenceException
。 如果长循环执行,这可能会非常烦人,甚至令人望而却步。 我通常不会收到NullReferenceException
异常,但是我真的不想关闭此异常警告。 我捕获NullReferenceException
的原因(显然,空条件运算符不执行此操作)是,在复合属性路径的情况下,我想避免IfNotNull
嵌套。
我不想使用反射,因为我希望operation
的内容可以是消费者想要的任何内容(例如,方法,字段,甚至是逻辑操作)。
我真的等不及要升级到Visual Studio 2017。
(是的,我知道Visual Studio 2015中提供了空条件运算符。由于它是最新版本,因此我们正在升级到2017年。)
此外:调试时,Visual Studio将异常报告为弹出窗口。 除非您正在调试,否则在运行时或在单元测试中不会发生这种情况。 我有一个catch块,调试时不应将Visual Studio弹出此异常。 它应该被抓住。
更进一步:好的,我想我知道人们在要求什么。 这不是运行时问题。 这是一个调试问题。 Visual Studio正在报告从lambda表达式中引发的NullReferenceException,该表达式是从捕获NullReferenceException的try捕获块中调用的。 为什么Visual Studio应该就此警告我,以及如何使其停止? 这就是我所能做到的简洁。
评论时间过长,请在此处发布以进行评论。
使用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; }
}
调试或运行完成时都不会引发异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.