我有一些带有一些属性的类,我想将值从字符串转换为此属性的类型。我有转换为可空类型的问题。这是我的转换方法:
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, 公钥= b77a5c561934e089]]”。
如何将type从type转换为nullable类型? 感谢。
答案 0 :(得分:4)
这是不可能的......价值类型的拳击“擦除”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);
}
答案 1 :(得分:1)
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);