将C#6.0降级为5.0代码

时间:2017-07-12 09:04:32

标签: c#

我现在用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;

但我仍然在??

上收到错误

请有人帮忙吗?

1 个答案:

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