gpt4 book ai didi

c# - ICustomAttributeProvider.GetCustomAttributes(...) : Design Strangety?

转载 作者:行者123 更新时间:2023-11-30 12:53:01 26 4
gpt4 key购买 nike

MSDN 文档:MemberInfo.GetCustomAttibutes Method (Type, Boolean)备注中指出:

This method ignores the inherit parameter for properties and events. To search the inheritance chain for attributes on properties and events, use the appropriate overloads of the Attribute.GetCustomAttributes method.

这基本上意味着对于事件成员属性成员,此实现的第二个参数(bool inherit)被忽略。但是,调用此操作的 Attribute.GetCustomAttributes(MemberInfo,Type,bool) 变体不会。

令我困惑的是这个的设计。

为什么他们似乎会任意忽略 2 种形式的成员类型的继承属性?

如果有人能阐明这一点,我将不胜感激。

最佳答案

这绝对令人困惑。严格的答案是属性和事件不会被继承,所以 inherited 参数没有意义。引用是 ECMA 335 CLI Specification第 8.10.3 节。

Fundamentally, properties and events are constructs of the metadata intended for use by tools that target the CLI and are not directly supported by the VES itself. Therefore, it is the job of the source language compiler and the reflection library (see Partition IV) to determine rules for name hiding, inheritance, and so forth. The source compiler shall generate CIL that directly accesses the methods named by the events and properties, not the events or properties themselves.

规范没有说明编译器应该如何实现它。在 C# 的情况下,属性是通过单独的 getter 和 setter 方法实现的,这些方法可以声明为 virtualoverride。同样,对于事件,有单独的 addhandler 和 removehandler 方法。

所以简单的答案是属性和事件是严格的元数据,没有根据规范进行任何实现。这就是为什么它们不能像方法一样被继承。

关于c# - ICustomAttributeProvider.GetCustomAttributes(...) : Design Strangety?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3103709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com