C#有没有办法让这句话更简洁?

C#有没有办法让这句话更简洁?,c#,C#,我有一段代码,比如 return x != null ? new Something() { Foo = x.Something, Bar = x.SomethingElse } : null; 我不能在这里使用null传播运算符,因为它与我想要的相反(如果x为null,则需要我定义返回的内容,如果x不是null,则不需要定义返回的内容)。但我不喜欢我拥有的 有更好的方法吗?您可以根据x创建一个扩展方法,这样您就可以执行以下操作: return x?.toSomething(); 使用常规

我有一段代码,比如

return x != null ? new Something() { Foo = x.Something, Bar = x.SomethingElse } : null; 
我不能在这里使用null传播运算符,因为它与我想要的相反(如果
x
null
,则需要我定义返回的内容,如果
x
不是
null
,则不需要定义返回的内容)。但我不喜欢我拥有的


有更好的方法吗?

您可以根据x创建一个扩展方法,这样您就可以执行以下操作:

return x?.toSomething();

使用常规语法比此更简洁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;
     }
}
return x.MapIfNotNull<A, B>((s, t) => { t.Foo = s.Something; t.Bar = s.SomethingElse; });
公共静态类ObjectExtensions
{
公共静态T MapIfNotNull(此T部分,函数映射)
T:在哪里上课
{
Contract.Requires(map!=null);
返回一些!=null?映射(一些):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;
     }
}
公共静态类ObjectExtensions
{
公共静态T MapIfNotNull(此T源,Func映射)
其中TReturn:class,new()
{
Contract.Requires(map!=null);
if(source==null)
返回;
TReturn目标=映射(源,新TReturn());
回报目标;
}
}
…并按如下方式使用它:

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;
     }
}
return x.MapIfNotNull<A, B>((s, t) => { t.Foo = s.Something; t.Bar = s.SomethingElse; });
返回x.MapIfNotNull以进一步简化:

return mapper.Map<A, B>(a);
返回mapper.Map(a);

>P>当你考虑字符数时,它并不短,但是它的宽度较短,因此更容易在屏幕上安装,而且非常可读:

简单地把它分成两个语句。只是要足够聪明,避免过于聪明

if (x == null) return null;
return new Something { Foo = x.Something, Bar = x.SomethingElse };

您甚至不需要使用
?。
只需使扩展方法足够健壮,以支持为
参数传入null即可。你可以做
x.toSomething()