我现在用VS 2015(C#6)写的代码由于某些原因我想把它降级到C#5有人能帮帮我吗?
var idpEntityId = ClaimsPrincipal.Current.FindFirst(AuthServicesClaimTypes.LogoutNameIdentifier)?.Issuer ?? ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier)?.Issuer;
我转换为
ClaimsPrincipal.Current.FindFirst(AuthServicesClaimTypes.LogoutNameIdentifier) != null ? ClaimsPrincipal.Current.FindFirst(AuthServicesClaimTypes.LogoutNameIdentifier).Issuer : null;
??
ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier) != null ? ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Issuer : null;
但我仍然在??
请有人帮忙吗?
答案 0 :(得分:2)
你的单行
var idpEntityId = ClaimsPrincipal.Current.FindFirst(AuthServicesClaimTypes.LogoutNameIdentifier)?.Issuer ?? ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier)?.Issuer;
将转换为以前版本的C#中的以下构造:
var logoutNameIdentifier = ClaimsPrincipal.Current.FindFirst(AuthServicesClaimTypes.LogoutNameIdentifier);
var lniIssuer = logoutNameIdentifier != null ? logoutNameIdentifier.Issuer : null;
var idpEntityId = lniIssuer;
if (idpEntityId == null)
{
var ctNameIdentifier = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier);
if (ctNameIdentifier != null)
idpEntityId = ctNameIdentifier.Issuer;
}
相当复杂一点。因此我想写下面的扩展方法:
public static U NonNullMap<T, U>(this T t, Func<T, U> m)
{
return t != null ? m(t) : default(U);
}
这样,代码如下所示:
var idpEntityId = ClaimsPrincipal.Current
.FindFirst(AuthServicesClaimTypes.LogoutNameIdentifier)
.NonNullMap(lni => lni.Issuer);
if (idpEntityId == null)
idpEntityId = ClaimsPrincipal.Current
.FindFirst(ClaimTypes.NameIdentifier)
.NonNullMap(ni => ni.Issuer);
在我看来,仍然冗长但至少更具可读性。
编辑:如果??
运算符在C#5.0中运行,则可以将代码缩短为:
var idpEntityId = ClaimsPrincipal.Current
.FindFirst(AuthServicesClaimTypes.LogoutNameIdentifier)
.NonNullMap(lni => lni.Issuer) ??
ClaimsPrincipal.Current
.FindFirst(ClaimTypes.NameIdentifier)
.NonNullMap(ni => ni.Issuer);