如何将值从对象转换为Nullable<>;

本文关键字:Nullable lt gt 转换 对象 | 更新日期: 2023-09-27 17:51:00

我有一个带有一些属性的类,我想将值从字符串转换为这个属性的类型。我对转换为可为null的类型有问题。这是我的转换方法:

public static object ChangeType(object value, Type type)
{
    if (type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
    {
        if (value == null)
        {
            return null;
        }
        var underlyingType = Nullable.GetUnderlyingType(type);
        var val = Convert.ChangeType(value, underlyingType);
        var nullableVal = Convert.ChangeType(val, type); // <-- Exception here
        return nullableVal;
    }
    return Convert.ChangeType(value, type);
}

我得到这样的异常(对于int类型的属性?(:

从"System.Int32"到"System.Nullable"1的强制转换无效[[System.Int32,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]]'

如何从类型转换为可为null的类型?谢谢

如何将值从对象转换为Nullable<>;

这是不可能的。。。值类型的装箱"擦除"Nullable<>部分。。。

int? num = 5;
object obj = num;
Console.WriteLine(obj.GetType()); // System.Int32

int? num = null;
object obj = num;
Console.WriteLine(obj == null); // True

请注意,这个特性使Nullable<>"特别"。他们需要CLR的直接支持。Nullable<>不仅仅是一个可以编写的结构。

你能做什么:

public static object ChangeType(object value, Type type)
{
    // returns null for non-nullable types
    Type type2 = Nullable.GetUnderlyingType(type);
    if (type2 != null)
    {
        if (value == null)
        {
            return null;
        }
        type = type2;
    }
    return Convert.ChangeType(value, type);
}
var nullableVal = Activator.CreateInstance(type, val);

使用激活器可以创建int?类的新实例,其中一个参数将传递给int值的构造函数。下面的代码是这样的文字演示:

var type = typeof(int?);
var underlyingType = typeof(int);
var val = 123;
var nullableVal = Activator.CreateInstance(type, val);