我有一个界面,其中的方法使用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
我错过了什么?
请注意,我没有类或实例。只有界面。
答案 0 :(得分:3)
使用您选择的反编译器并打开您的程序集。您将看到编译器将删除PureAttribute
。所以你不能用反射得到它,因为它不再存在。
要测试你可以使用另一个不会删除的属性,你可以使用反射来获取它。
<强>更新强>: 一方面,正如您在评论中提到的那样:
Pure是条件属性([Conditional(“CONTRACTS_FULL”)]),仅在合同启用时才会添加。
另一方面,您的代码存在缺陷,因为Linqs First()
方法将返回没有属性的成员,即属性的getter方法。您可以使用这样的代码来获得预期的结果:members.Where(x => x.GetCustomAttributes<PureAttribute>().Any()).ToArray()
。