【发布时间】:2023-03-13 04:12:01
【问题描述】:
我正在重写一些使用反射为 .NET Standard 1.4 编译的代码(目前针对 .NET 4.5.2。)。因此,我需要在很多地方对 Type 使用 GetTypeInfo()。
为了正确处理边缘情况,我的问题是,GetTypeInfo() 可以返回 null 吗?文档 (https://msdn.microsoft.com/en-us/library/system.reflection.introspectionextensions.gettypeinfo(v=vs.110).aspx) 对此保持沉默。
当我从标准 .NET 4.5.2 项目打开 GetTypeInfo() 源时,我得到:
public static class IntrospectionExtensions
{
public static TypeInfo GetTypeInfo(this Type type){
if(type == null){
throw new ArgumentNullException("type");
}
var rcType=(IReflectableType)type;
if(rcType==null){
return null;
}else{
return rcType.GetTypeInfo();
}
}
}
这仍然令人困惑。当 '(IReflectableType)type' 为 null 时,有一个代码分支返回 null,但为什么呢? - 'type' 本身之前会针对 null 进行检查,当它为 null 时会引发异常,因此我看不到 'rcType' 怎么可能为 null(请注意,这不是 'as' 运算符,它是直接类型转换)。
按照良好的传统,有关 IReflectableType.GetTypeInfo (, https://msdn.microsoft.com/en-us/library/system.reflection.ireflectabletype.gettypeinfo(v=vs.110).aspx ) 的文档也对空结果的可能性保持沉默。
使用反射的代码需要在许多地方使用 GetTypeInfo,如果允许 null 结果,则需要在每个这样的地方进行 null 检查和相应的操作。我检查了其他人的代码(包括微软自己在https://msdn.microsoft.com/en-us/library/system.reflection.typeinfo%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396 的示例),开发人员似乎将其视为不可能的空结果。对吗?
【问题讨论】:
-
由于
TypeInfo是refactoring 最初由Type覆盖的部分内容,而Object.GetType()永远不会返回null(有充分的理由),我永远不会期望.GetTypeInfo()也能返回null。该类型可能无法以某种方式加载,但您会期望出现异常,而不是null。 -
如果它确实返回了
null,你会怎么做,你需要做些什么来实现它吗? IE。如果您此时抛出异常并且您的下一行代码正在调用TypeInfo上的方法,那么您已经将得到一个异常无论如何如果结果是null. -
@Damien_The_Unbeliever:这取决于最终的“空”可能性意味着什么,以及使用上下文。有时可能有一种安全的回退方法来实现目标,有时可能适合抛出特定异常。但我绝不会允许我的代码抛出 NullReferenceException,这是为编码(使用)错误保留的,而不是在正确编写的代码中实际可能发生的任何情况。
-
@Jeroen Mostert:这是一个很好的推理,谢谢。我也倾向于得出结论,'null' 不是来自 GetTypeInfo() 的有效返回值。很高兴能以文档或 Microsoft 声明的形式看到“证明”,或者至少能够检查所有现有的 GetTypeInfo() 实现以查看它们是否满足这一点。
-
在 MSDN 文档中,他们通常会注意该方法是否会返回 null 或抛出异常,如果没有提及,则可以安全地假设它不会。
标签: c# .net .net-standard