Mik*_*und 6 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();
}
Run Code Online (Sandbox Code Playgroud)
我希望遍历接口的成员并检查成员是否是纯粹的.目前我无法从会员信息中获取任何属性:
var type = typeof(IFoo<>);
var memberInfos = type.GetMembers();
var memberInfo = memberInfos.First(); // <-- Just select one of them
var attributes = memberInfo.GetCustomAttributesData(); // <-- Empty
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
请注意,我没有类或实例.只有界面.
使用您选择的反编译器并打开您的程序集。您将看到PureAttribute将会被编译器删除。所以你不能通过反射得到它,因为它不再存在了。
为了进行测试,您可以使用另一个不会被删除的属性,并且您将能够使用反射来获取它。
更新:一方面,正如您在评论中提到的:
Pure 是一个条件属性 ([Conditional("CONTRACTS_FULL")]),仅在启用合约时添加。
另一方面,您的代码有一个缺陷,因为 LinqsFirst()方法将返回一个没有属性的成员,即属性的 getter 方法。您可以使用这样的代码来获得预期的结果:members.Where(x => x.GetCustomAttributes<PureAttribute>().Any()).ToArray()。