C# 如何在程序集中查找自定义属性的所有引用?

C# 如何在程序集中查找自定义属性的所有引用?,c#,reflection,custom-attributes,C#,Reflection,Custom Attributes,如何查找程序集中出现的每个自定义属性 If可以从使用属性的程序集中找到所有类型,但这还不够。方法、属性、枚举、枚举值、字段等如何 是否有任何快捷方式来执行此操作,或者编写代码来搜索类型的所有部分(属性、字段、方法等)是唯一的方法 Reflector就是这样做的,但不确定它是如何实现的。您可以使用它来获取所有成员(属性、方法、字段等),而不是单独处理每种成员。这至少会让事情变得简单一些 请注意,您可能希望传入各种绑定标志(实例、静态、公共、非公共),以确保捕获所有内容。 assembly.GetT

如何查找程序集中出现的每个自定义属性

If可以从使用属性的程序集中找到所有类型,但这还不够。方法、属性、枚举、枚举值、字段等如何

是否有任何快捷方式来执行此操作,或者编写代码来搜索类型的所有部分(属性、字段、方法等)是唯一的方法

Reflector就是这样做的,但不确定它是如何实现的。

您可以使用它来获取所有成员(属性、方法、字段等),而不是单独处理每种成员。这至少会让事情变得简单一些

请注意,您可能希望传入各种绑定标志(实例、静态、公共、非公共),以确保捕获所有内容。

assembly.GetTypes()
    .SelectMany(type => type.GetMembers())
    .Union(assembly.GetTypes())
    .Where(type => Attribute.IsDefined(type, attributeType));

这也将返回
enum
值,因为这些值只是引擎盖下的公共静态字段。此外,如果您想要私有成员,则必须调整传入的
BindingFlags

我是否也获得枚举值?不是枚举本身,而是值?@Marcus,枚举是类型,因此首先需要使用
GetTypes
方法获取程序集中的所有类型,然后对每个类型应用
GetMembers
方法。您将需要两个嵌套循环。@Marcus:GetMembers()将返回字段,枚举类型的值是字段。@Darin,是的,我知道了,所以我必须手动检查当前成员是否是枚举,然后“查询”它的枚举值,以同时检查属性?@Marcus,不,您不需要检查它是否是枚举。你不应该关心这个。正如@Jon所说,如果当前类型是枚举,
GetMembers()
方法将返回此枚举的字段,以便您可以检查它们是否用自定义属性修饰。