检查通用接口成员是否为 "Pure"(具有纯属性)
Check if Generic Interface Member is "Pure" (has Pure Attribute)
我有一个接口,其中的方法用 System.Diagnostics.Contracts
中的 Pure
属性注释:
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
我错过了什么?
请注意,我没有 class 或此处的实例。只有界面。
使用您选择的反编译器并打开您的程序集。您会看到 PureAttribute
将被编译器删除。所以你不能通过反射得到它,因为它已经不存在了。
要进行测试,您可以使用不会被删除的另一个属性,您将能够使用反射获取它。
更新:
一方面,正如您在评论中提到的:
Pure is a conditional attribute ([Conditional("CONTRACTS_FULL")]), and is only added if contracts are enable.
另一方面,您的代码有一个缺陷,因为 Linqs First()
方法将 return 一个没有属性的成员,即 属性 的 getter 方法。您可以使用这样的代码来获得预期的结果:members.Where(x => x.GetCustomAttributes<PureAttribute>().Any()).ToArray()
.
我有一个接口,其中的方法用 System.Diagnostics.Contracts
中的 Pure
属性注释:
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
我错过了什么?
请注意,我没有 class 或此处的实例。只有界面。
使用您选择的反编译器并打开您的程序集。您会看到 PureAttribute
将被编译器删除。所以你不能通过反射得到它,因为它已经不存在了。
要进行测试,您可以使用不会被删除的另一个属性,您将能够使用反射获取它。
更新: 一方面,正如您在评论中提到的:
Pure is a conditional attribute ([Conditional("CONTRACTS_FULL")]), and is only added if contracts are enable.
另一方面,您的代码有一个缺陷,因为 Linqs First()
方法将 return 一个没有属性的成员,即 属性 的 getter 方法。您可以使用这样的代码来获得预期的结果:members.Where(x => x.GetCustomAttributes<PureAttribute>().Any()).ToArray()
.