C# 属性是否可以没有 GetMethod 和 SetMethod

H B*_*amy 5 c# reflection propertyinfo linq-expressions

浏览 System.Linq.Expressions 的 .NET 核心源代码,我发现以下代码位于此处

MethodInfo mi = property.GetGetMethod(true);
if (mi == null)
{
    mi = property.GetSetMethod(true);
    if (mi == null)
    {
        throw Error.PropertyDoesNotHaveAccessor(property, nameof(property));
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有什么办法GetGetMethod GetSetMethod既可以返回null,因为似乎占了这里?这是死代码吗?C# 编译器不允许属性没有 getter 和 setter,所以这对PropertyInfo.

我的动机是通过添加测试覆盖率来为 OSS 代码做出贡献,所以我想看看哪些测试用例会覆盖这个

Jim*_*hel 3

根据CLI 规范

\n\n
\n

CLS 规则 28:属性应遵循特定的命名模式。请参阅\n \xc2\xa7I.10.4。CLS 规则 24 中引用的 SpecialName 属性在适当的名称比较中应被忽略,并应遵守标识符规则。属性应具有 getter 方法、setter 方法或两者。

\n
\n\n

这是链接 PDF 的第 52 页。

\n\n

这似乎是说,其中之一必定存在。

\n\n

看来开发人员决定以这种方式解释规范,并在面对无效数据时采取相应的行动。看起来这是一件很合理的事情。

\n\n

通过编写 IL 或随后编辑元数据,有可能创建一个没有 getter 或 setter 的属性。.NET 加载程序可能会继续加载它,即使它被视为无效属性。我在其他领域也看到过类似的事情发生。

\n\n

考虑到这一点,处理既没有 getter 也没有 setter 的属性的“不可能”情况的代码对我来说似乎并不是死代码。

\n