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

Mik*_*und 6 c# generics reflection interface custom-attributes

我有一个接口,其方法使用以下Pure属性进行注释System.Diagnostics.Contracts:

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

    [Pure]
    T Last { get; }

    [Pure]
    T Choose();

    void Add(T item);

    T Remove();
}
Run Code Online (Sandbox Code Playgroud)

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

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

我错过了什么?

请注意,我没有类或实例.只有界面.

the*_*nyy 4

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

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

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

Pure 是一个条件属性 ([Conditional("CONTRACTS_FULL")]),仅在启用合约时添加。

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