我有一段像
这样的代码return x != null ? new Something() { Foo = x.Something, Bar = x.SomethingElse } : null;
我不能在这里使用null传播运算符,因为它与我想要的相反(如果x
是null
,我会定义要返回的内容,而不是x
不是null
)。但我不喜欢我拥有的东西。
有更好的方法吗?
答案 0 :(得分:3)
您可以创建任何x的扩展方法,这样您就可以执行:
return x?.toSomething();
答案 1 :(得分:1)
比使用常规语法 no 更紧凑。
顺便说一下,你可以实现一个扩展方法:
return x.MapIfNotNull(o => new Something { Foo = o.Something, Bar = o.SomethingElse });
扩展方法如下所示:
public static class ObjectExtensions
{
public static T MapIfNotNull<T, TReturn>(this T some, Func<T, TReturn> map)
where T : class
{
Contract.Requires(map != null);
return some != null ? map(some) : null;
}
}
您甚至可以超越并简化实例化:
public static class ObjectExtensions
{
public static T MapIfNotNull<T, TReturn>(this T source, Func<T, TReturn, TReturn> map)
where TReturn : class, new()
{
Contract.Requires(map != null);
if(source == null)
return;
TReturn target = map(source, new TReturn());
return target;
}
}
...并按如下方式使用:
return x.MapIfNotNull<A, B>((s, t) => { t.Foo = s.Something; t.Bar = s.SomethingElse; });
或者您甚至可以使用AutoMapper来进一步简化它:
return mapper.Map<A, B>(a);
答案 2 :(得分:1)
考虑到字符数时,它不会更短,但 的宽度更短,因此更有可能适合您的屏幕,并且非常易读:
简单地将其分成两个陈述。只是聪明到足以避免过于聪明。
if (x == null) return null;
return new Something { Foo = x.Something, Bar = x.SomethingElse };