【问题标题】:Check if Generic Interface Member is "Pure" (has Pure Attribute)检查通用接口成员是否为“纯”(具有纯属性)
【发布时间】:2016-07-28 15:44:15
【问题描述】:

我有一个接口,其方法使用来自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

我错过了什么?

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

【问题讨论】:

  • 检查一下 - stackoverflow.com/questions/540749/… 您可能需要重新考虑在您的界面上设置属性。
  • 但是,这不是关于继承属性的类的问题吗?我想查看界面及其成员
  • @Wjdavis5 我真的没有任何实现可以看,只有接口。

标签: c# generics reflection interface custom-attributes


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 好的,我明白了。它实际上已经消失了。那么告诉我:代码契约如何知道一个方法是不是纯的?
  • 老实说,我不知道,也许正在使用另一个或稍作修改的编译器。
  • 哦,等等。 Pure 是一个条件属性 ([Conditional("CONTRACTS_FULL")]),仅在启用合约时添加。如果启用 CC,则该属性实际上在程序集中可见(使用 dotPeeks) - 但是,它们仍然不会通过反射显示。
  • 对我来说它有效members.Where(x =&gt; x.GetCustomAttributes&lt;PureAttribute&gt;().Any()).ToArray()。也许您使用 linqs First 获得的成员返回一个没有属性的成员,例如 getter 方法。
  • 你是对的,这正是使用 LINQ First() 方法的问题。第一个成员是Firstget 方法,而不是属性本身,get 方法实际上没有属性。
猜你喜欢
  • 1970-01-01
  • 2020-11-24
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
相关资源
最近更新 更多