Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查通用接口成员是否为;纯粹的;(具有纯属性)_C#_Generics_Reflection_Interface_Custom Attributes - Fatal编程技术网

C# 检查通用接口成员是否为;纯粹的;(具有纯属性)

C# 检查通用接口成员是否为;纯粹的;(具有纯属性),c#,generics,reflection,interface,custom-attributes,C#,Generics,Reflection,Interface,Custom Attributes,我有一个与方法的接口,这些方法用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(); } 公共接口IFoo{ [纯] T首先{get;} [纯

我有一个与方法的接口,这些方法用
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();
}
公共接口IFoo{
[纯]
T首先{get;}
[纯]
T Last{get;}
[纯]
不要选择();
无效添加(T项);
T删除();
}
我希望迭代接口的成员,并检查该成员是否为纯成员。 目前我无法从成员信息中获取任何属性:

var type = typeof(IFoo<>);
var memberInfos = type.GetMembers();
var memberInfo = memberInfos.First(); // <-- Just select one of them
var attributes = memberInfo.GetCustomAttributesData(); // <-- Empty
var type=typeof(IFoo);
var memberInfos=type.GetMembers();

var memberInfo=memberInfos.First();// 使用您选择的反编译器并打开程序集。您将看到编译器将删除
PureAttribute
。所以你不能通过反射得到它,因为它已经不存在了

为了进行测试,您可以使用另一个不会被删除的属性,并且可以使用反射来获得它

更新: 一方面,正如你在评论中提到的:

Pure是一个条件属性([conditional(“CONTRACTS_FULL”)]),仅在启用合同时添加


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

检查一下-您可能需要重新考虑在接口上使用属性。但这不是关于类继承属性的问题吗?我只想看看接口及其成员。@Wjdavis5,我实际上没有任何实现要看,只有接口。好的,我明白了。事实上,它已经消失了。然后告诉我:代码契约如何知道一个方法是纯的还是非纯的?老实说,我不知道,也许有另一个或稍微修改过的编译器在使用。哦,等等。Pure是一个条件属性(
[conditional(“CONTRACTS_FULL”)]
),仅在启用合同时添加。如果启用了CC,则该属性在程序集中实际上是可见的(使用DotPeek)——但是,它们仍然不会显示为反射。对我来说,它可以
成员。其中(x=>x.GetCustomAttributes().Any()).ToArray()
。可能您使用linqs
First
获得的成员返回一个没有属性的成员,就像getter方法一样。您是对的,这正是使用LINQ
First()
方法的问题所在。第一个成员是
get
方法,用于
first
,而不是属性本身,而且
get
方法实际上没有属性。