【问题标题】:Can GetTypeInfo ever return null?GetTypeInfo 可以返回 null 吗?
【发布时间】: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 的示例),开发人员似乎将其视为不可能的空结果。对吗?

【问题讨论】:

  • 由于TypeInforefactoring 最初由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


【解决方案1】:

GetTypeInfo() 永远不应该返回 null。

请参阅 .NET Core 中的 new code 以及移植此代码的 Microsoft 人员留下的评论。

【讨论】:

  • 最后,我同意(实际上,新代码仍然委托给 IReflectableType 的实现,但代码本身仍然没有回答这个问题)。到目前为止,还没有“权威”的答案,但是对于 GetTypeInfo() 永远不应该返回 null 的事实的暗示占绝大多数。
猜你喜欢
  • 2012-07-06
  • 2016-10-17
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多