C#是否有办法使这个陈述更紧凑?

时间:2016-08-30 21:07:33

标签: c#

我有一段像

这样的代码
return x != null ? new Something() { Foo = x.Something, Bar = x.SomethingElse } : null; 

我不能在这里使用null传播运算符,因为它与我想要的相反(如果xnull,我会定义要返回的内容,而不是x不是null)。但我不喜欢我拥有的东西。

有更好的方法吗?

3 个答案:

答案 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 };