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

时间:2016-04-07 16:07:02

标签: 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();
}

我希望迭代界面的成员并检查成员是否是纯粹的。 目前,我无法从会员信息中获取任何属性:

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

我错过了什么?

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

1 个答案:

答案 0 :(得分:3)

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

要测试你可以使用另一个不会删除的属性,你可以使用反射来获取它。

<强>更新: 一方面,正如您在评论中提到的那样:

  

Pure是条件属性([Conditional(“CONTRACTS_FULL”)]),仅在合同启用时才会添加。

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