Convert.ChangeType引发可空int的无效转换异常

时间:2018-10-26 15:27:40

标签: c#

如果我在下面调用GetClaimValue方法,则获取无效的强制转换异常,其中T是可为null的int。

private static T GetClaimValue<T>(string claimType, IEnumerable<Claim> claims)
{
    var claim = claims.SingleOrDefault(c => c.Type == claimType);

    if (claim != null)
        return (T) Convert.ChangeType(claim.Value, typeof(T));

    return default(T);
}

例如:

 GetClaimValue<int?>(IdentityServer.CustomClaimTypes.SupplierId, claims)

有人知道如何处理吗?

2 个答案:

答案 0 :(得分:2)

我假设Claim.Value的类型为Object,并且您在此处进行动态转换,因此无法通过{直接将int转换为int? {1}}。

一种选择是使用Convert.ChangeType,它将检查这是否为可为空的结构情况,首先通过基础数据类型进行转换,然后转换为Nullable.GetUnderlyingType

您还需要处理T情况。

null

答案 1 :(得分:1)

我无法解释为什么会引发异常,但是当我使用Convert.ChangeType时,情况也类似。

尝试先获取您传入的类型的转换器,然后使用该转换器进行转换。使用这种方法效果更好。

var converter = TypeDescriptor.GetConverter(typeof(T));
return (T)converter.ConvertFrom(claim.Value);