C# 可为null的create via reflection,HasValue=false,仅给定'type'类型的参数
给定一个可为C# 可为null的create via reflection,HasValue=false,仅给定'type'类型的参数,c#,reflection,nullable,C#,Reflection,Nullable,给定一个可为null的类型参数,如何创建具有HasValue=false的该类型的实例 换句话说,请完成以下代码: //type is guaranteed to implement Nullable<> public static object Create(Type type) { //Instantiate a Nullable<T> with reflection whose HasValue = false, and return it } 给定一个类
null的类型参数
,如何创建具有HasValue=false的该类型的实例
换句话说,请完成以下代码:
//type is guaranteed to implement Nullable<>
public static object Create(Type type)
{
//Instantiate a Nullable<T> with reflection whose HasValue = false, and return it
}
给定一个类型参数,它是可为空的,如何创建HasValue=false的该类型的实例
如果您想要一个签名为object
的方法,只需返回null
:
//type is guaranteed to be implement from Nullable<>
public static object Create(Type type)
{
return null;
}
当然,如果type
不能保证是可为空的值类型,则可能需要对代码进行条件化。。。但重要的是要理解,不存在可为null的值的对象表示。即使对于非null值,装箱表示也是不可为null类型的装箱表示:
给定一个类型参数,它是可为空的,如何创建HasValue=false的该类型的实例
如果您想要一个签名为object
的方法,只需返回null
:
//type is guaranteed to be implement from Nullable<>
public static object Create(Type type)
{
return null;
}
当然,如果type
不能保证是可为空的值类型,则可能需要对代码进行条件化。。。但重要的是要理解,不存在可为null的值的对象表示。即使对于非null值,装箱表示也是不可为null类型的装箱表示:
高度危险的(不建议用于非测试目的)是使用“方法UnsafeTools.Box(T?null)
”。它绕过了可空类型的常规装箱(装箱或返回null),而是创建了可空的实际实例。请注意,使用这样的实例可能会有很大的问题
public static object Create<T>() where T : struct //T must be a normal struct, not nullable
{
return UnsafeTools.Box(default(T?));
}
publicstaticobjectcreate(),其中T:struct//T必须是普通结构,不能为null
{
返回UnsafeTools.Box(默认值(T?);
}
高度危险(不建议用于非测试目的)是使用“方法UnsafeTools.Box(T?null)
”。它绕过了可空类型的常规装箱(装箱或返回null),而是创建了可空的实际实例。请注意,使用这样的实例可能会有很大的问题
public static object Create<T>() where T : struct //T must be a normal struct, not nullable
{
return UnsafeTools.Box(default(T?));
}
publicstaticobjectcreate(),其中T:struct//T必须是普通结构,不能为null
{
返回UnsafeTools.Box(默认值(T?);
}
我需要这样做的原因是,当实例为null时,我需要支持对Nullable上的方法的调用。当检索HasValue=false的可空属性的值时,反射返回null
,这当然不同于“普通”编译代码中的行为。@IanNewson:您在这里没有给出任何上下文,但您需要了解可空值类型的装箱规则。上下文是我负责一个LINQ提供程序,该提供程序出于性能原因对表达式本身中的大量代码进行求值,而不是将表达式编译为Func
或类似的。在nullNullable
s上调用方法似乎是反射API无法处理的边缘情况,即调用getValueOrDefault.Invoke(aNullNullable)
throws。我正在努力解决这个问题。@IanNewson:如果没有看到任何实际的反射代码,很难判断您看到了什么。听起来你应该问一个新问题,基于这样一个理解,即装箱的可空值是“装箱的基础值”或“空引用”。我需要这样做的原因是,当实例为空时,我需要支持对可空方法的调用。当检索HasValue=false的可空属性的值时,反射返回null
,这当然不同于“普通”编译代码中的行为。@IanNewson:您在这里没有给出任何上下文,但您需要了解可空值类型的装箱规则。上下文是我负责一个LINQ提供程序,该提供程序出于性能原因对表达式本身中的大量代码进行求值,而不是将表达式编译为Func
或类似的。在nullNullable
s上调用方法似乎是反射API无法处理的边缘情况,即调用getValueOrDefault.Invoke(aNullNullable)
throws。我正在努力解决这个问题。@IanNewson:如果没有看到任何实际的反射代码,很难判断您看到了什么。听起来你应该问一个新的问题,基于这样的理解,一个装箱的可空值要么是“装箱的基础值”要么是“空引用”。所以如果你调用Create().GetType()
,它会有效地返回typeof(int?
?真有趣…@乔恩,没错。甚至可以将其强制转换回(int?
。因此,如果调用Create().GetType()
,是否会有效地返回typeof(int?
?真有趣…@乔恩,没错。甚至可以将其转换回(int?
)。
public static object Create<T>() where T : struct //T must be a normal struct, not nullable
{
return UnsafeTools.Box(default(T?));
}