当前位置: 首页 > 编程语言 > C#

通过反射检测可空类型分享

时间:2023-04-11 00:42:39 C#

通过反射检测可空类型令人惊讶的是,以下代码失败了Assert:int?重量=0;Assert.IsType(wtf);因此,出于好奇,您如何确定给定实例是否为Nullable对象?首先,Nullable是一个结构体,所以没有这样的对象。您不能调用GetType(),因为它将值设置为null(此时您要么得到null并因此出现异常,要么得到一个装箱的不可为null的值,因此不是您想要的类型)。(这里的装箱会干扰你的断言——我假设IsType接受对象。)你可以使用类型推断来获取变量的类型作为类型参数:publicboolIsNullable(Tvalue){returnNullable.GetUnderlyingType(typeof(T))!=null;当您在编译时知道确切的类型时,这不是很有用,但它对泛型很有用。(当然,还有其他方法可以实现。)那你的现实生活情况呢?我不认为这是一个这样的断言,因为你在编译时就知道了。诠释?我=0;vartype=TypedReference.GetTargetType(__makeref(i));varisNullable=type.IsGenericType&&type.GetGenericTypeDefinition()==typeof(Nullable);我喜欢@jon-skeet的回答,但它只有在您知道要测试的类型时才有效。在我们的世界中,我们使用反射来打开对??象并测试正则表达式的值。我们最好简化任何一种缩放工作。publicstaticboolIsNullable(thisTypetype){returnNullable.GetUnderlyingType(type)!=null;}泛型是生命之血,但有时......?什么是Assert命名空间?如您所料,以下返回true:int?重量=0;if(typeof(Nullable).IsInstanceOfType(wtf)){//Dothings}虽然值得注意typeof(Nullable).IsInstanceOfType(42)也返回true-这是因为此方法接受一个对象,因此被装箱为Nullable.这是我想到的,因为其他一切似乎都失败了——至少在可移植类库/DotNetCore>=C#6上,基本上,你扩展了通用类型Object和Nullable并使用与底层类型方法匹配的静态扩展,方法将被调用并优先于通用T扩展方法这一事实。publicstaticpartialclassObjectExtension{publicstaticboolIsNullable(thisTself){returnfalse;}}和一个NullablepublicstaticpartialclassNullableExtension{publicstaticboolIsNullable(thisNullableself)whereT:struct{returntrue;使用反射和type.IsGeneric和type.GetGenericParameters()在我当前的.NET运行时集上不起作用。以上就是C#学习教程:通过反射检测可空类型分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: