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()代码>