如何将数字字符串对象转换为可空数字

时间:2014-10-16 05:09:48

标签: c#

通过以下示例,对ConvertNumericStringObj进行了两次调用,它两次都发回一个Type int对象。

string strValue = "123";
object obj = ConvertNumericStringObj(typeof(int), strValue);
object obj = ConvertNumericStringObj(typeof(int?), strValue);   

public static object ConvertNumericStringObj(Type conversion, object value)
{
    var t = conversion;
    if (t.IsGenericType && t.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
    {
        if (value == null)
        {
            return null;
        }
        t = Nullable.GetUnderlyingType(t);
    }
    return Convert.ChangeType(value, t);
}

我的问题是:是否有传递字符串和int?类型并转换它以便它返回int?对象?

2 个答案:

答案 0 :(得分:1)

如果您希望类型可能 intint?,那么您所寻找的是“泛型”。这应该可以得到你想要的东西。

public static T ConvertNumericStringObj<T>(string value)
{
    var t = typeof (T);
    if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>))
    {
        if (string.isNullOrEmpty(value))
            return default(T);

        t = Nullable.GetUnderlyingType(t);
    }
    return (T)Convert.ChangeType(value, t);
}

然而,我很好奇为什么你不会只返回由int.TryParse()产生的可以为空的整数。

public static int? ConvertNumericStringObj(string value)
{
    int? x;

    if (int.TryParse(value , out x)
        return x;

    return null;
}

答案 1 :(得分:0)

是的,你可以。试试Int32.TryParse

public static int? ConvertNumericStringObj(string strValue)
{
    int x;
    if (Int32.TryParse(strValue , out x)
        return x;
    return null;
}

但我想知道,如果你一定需要通过int?

编辑,因为OP要求它有点通用,尝试扩展方法(粗略地),比如,

public static T? ConvertNumericStringObj<T>(string strValue) 
{
    if (string.IsNullOrEmpty(strValue))
        return null;
    return (T) Convert.ChangeType(strValue, typeof(T));
}

这样,您就可以使用as:

INT? x = strX.ConvertNumericStringObj();