【问题标题】:How to use Convert.ChangeType() when conversionType is a nullable int当conversionType 是可空的int 时如何使用Convert.ChangeType()
【发布时间】:2011-09-05 23:34:24
【问题描述】:

我的意思是,我想转换这个:

string a = 24;
Convert.ChangeType(a, typeof(decimal?))

但它给我一个错误。

更新 1:

我有一个 Type 对象,其中可以是小数?、整数?、.. 许多可为空的类型。然后使用 Type 对象,我需要转换类型对象中的字符串值。

【问题讨论】:

  • 你是说你有Type someType = typeof(T) 并且你想用它们来获得T myT
  • 没错,这就是我要找的。​​span>
  • 你不能安全地这样做。这些分配在编译时检查。
  • 您希望在什么情况下收到可为空的小数?

标签: c#


【解决方案1】:

看到一个很好的答案here

public static T GetValue<T>(string value)
{
   Type t = typeof(T);
   t = Nullable.GetUnderlyingType(t) ?? t;

   return (value == null || DBNull.Value.Equals(value)) ? 
      default(T) : (T)Convert.ChangeType(value, t);
} 

例如:

string a = 24;
decimal? d = GetValue<decimal?>(a);

【讨论】:

    【解决方案2】:

    这是基于 Dror 的回答,但在处理空值时开销略小:

    public static T GetValue<T>(string value)
    {
       if(value == null || DBNull.Value.Equals(value))
           return default(T);
    
       var t = typeof(T);
       return (T)Convert.ChangeType(value, Nullable.GetUnderlyingType(t) ?? t);
    } 
    

    【讨论】:

    • 我还添加了对 null 或空格的检查,但这是一个很好的答案,谢谢 string.IsNullOrWhiteSpace(value.ToString())
    【解决方案3】:

    你不能这样做,因为Nullable&lt;T&gt; 没有实现IConvertable

    你可以这样做。

    string a = 24;
    decimal? aAsDecimal = (decimal)Convert.ChangeType(a, typeof(decimal));
    

    我是否也对TryParse感兴趣?

    【讨论】:

    • 好的,但是例如,假设我的 typeConverter 是一个可为空的类型(十进制?),在 Type 对象中是否有一个属性只能获取十进制类型(不是十进制?)?
    • 您能否详细说明您的问题?
    猜你喜欢
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 2020-01-19
    相关资源
    最近更新 更多