检查通用接口成员是否为 "Pure"(具有纯属性)

Check if Generic Interface Member is "Pure" (has Pure Attribute)

我有一个接口,其中的方法用 System.Diagnostics.Contracts 中的 Pure 属性注释:

public interface IFoo<T> {
    [Pure]
    T First { get; }

    [Pure]
    T Last { get; }

    [Pure]
    T Choose();

    void Add(T item);

    T Remove();
}

我想遍历接口的成员并检查成员是否纯。 目前我无法从会员信息中获取任何属性:

var type = typeof(IFoo<>);
var memberInfos = type.GetMembers();
var memberInfo = memberInfos.First(); // <-- Just select one of them
var attributes = memberInfo.GetCustomAttributesData(); // <-- Empty

我错过了什么?

请注意,我没有 class 或此处的实例。只有界面。

使用您选择的反编译器并打开您的程序集。您会看到 PureAttribute 将被编译器删除。所以你不能通过反射得到它,因为它已经不存在了。

要进行测试,您可以使用不会被删除的另一个属性,您将能够使用反射获取它。

更新: 一方面,正如您在评论中提到的:

Pure is a conditional attribute ([Conditional("CONTRACTS_FULL")]), and is only added if contracts are enable.

另一方面,您的代码有一个缺陷,因为 Linqs First() 方法将 return 一个没有属性的成员,即 属性 的 getter 方法。您可以使用这样的代码来获得预期的结果:members.Where(x => x.GetCustomAttributes<PureAttribute>().Any()).ToArray().