检查通用接口成员是否为“纯净”的(具有纯净属性)

7

我有一个带有来自System.Diagnostics.ContractsPure属性注释的方法接口:

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

我错过了什么?

请注意,我这里没有类或其实例。只有接口。


看看这个 - https://dev59.com/-nRB5IYBdhLWcg3wtZMV您可能需要重新考虑在接口上设置属性。 - Wjdavis5
但是那个问题不是关于类继承属性的吗?我只想查看接口及其成员 - Mikkel R. Lund
@Wjdavis5 而且我没有任何实现可以查看,只有接口。 - Mikkel R. Lund
1个回答

4
使用您选择的反编译器打开汇编文件。您会发现编译器已经删除了 PureAttribute。因此,您不能再使用反射获取它,因为它已不存在。
您可以使用另一个不会被移除的属性进行测试,并且您将能够使用反射获得它。
更新: 一方面,如您在评论中提到的:
“纯洁”是一个条件属性([Conditional(“CONTRACTS_FULL”)]),仅在启用合同时添加。
另一方面,您的代码存在缺陷,因为 Linq 的 First() 方法将返回一个没有属性的成员,即属性的 getter 方法。您可以使用以下代码来获取预期的结果:members.Where(x => x.GetCustomAttributes().Any()).ToArray()

好的,我明白了。它确实消失了。那么告诉我:Code Contracts 如何知道一个方法是纯的还是不纯的? - Mikkel R. Lund
说实话,我不知道,也许有另一个或稍微修改过的编译器在使用。 - thehennyy
哦,等等。Pure是一个有条件的属性([Conditional("CONTRACTS_FULL")]),只有在启用合同时才会添加。如果启用了CC,则该属性实际上可见于程序集(使用dotPeeks)- 但是,它们仍然不会通过反射显示出来。 - Mikkel R. Lund
1
对我来说,members.Where(x => x.GetCustomAttributes<PureAttribute>().Any()).ToArray() 运行正常。也许你使用 Linq 的 First 获取的成员没有属性,比如一个 getter 方法。 - thehennyy
1
说得对,使用LINQ First()方法的确存在这个问题。第一个成员是Firstget方法,而不是属性本身,实际上该get方法并没有任何属性。 - devuxer
但是当然,多么愚蠢的错误!看起来现在完美地工作了。@thehennyy 你想更新你的答案以反映这一点吗? - Mikkel R. Lund

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接