不幸的是,您需要 C# 6 才能使用空条件运算符 ( ?.
)。
但是,您可以使用以下扩展方法对其进行模拟:
static class Extensions
{
public static TReturn NCR<T, TReturn>(this T instance, Func<T, TReturn> getter)
where T : class
where TReturn : class
{
if (instance != null)
return getter(instance);
return null;
}
public static TReturn NCR<T, TReturn>(this T? instance, Func<T, TReturn> getter)
where T : struct
where TReturn : class
{
if (instance != null)
return getter(instance.Value);
return null;
}
public static TReturn? NCV<T, TReturn>(this T instance, Func<T, TReturn> getter)
where T : class
where TReturn : struct
{
if (instance != null)
return getter(instance);
return null;
}
public static TReturn? NCV<T, TReturn>(this T? instance, Func<T, TReturn> getter)
where T : struct
where TReturn : struct
{
if (instance != null)
return getter(instance.Value);
return null;
}
}
(NC 代表 Null-Conditional,R 代表引用类型,V 代表值类型;它很丑陋,但不幸的是 C# 不允许仅因泛型约束而不同的方法重载)
你可以像这样使用它们:
IFoo3 c = objC.NCR(_ => _.Prop4)
.NCR(_ => _.Prop5)
.NCR(_ => _.Prop6)
.NCR(_ => _.Value);
(如果要获取的属性返回值类型,则使用 NCV 而不是 NCR)
它仍然太冗长,但至少更容易看到代码在做什么。