如果我在下面调用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)
有人知道如何处理吗?
答案 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);