ConditionalAttribute和其他特殊类

ConditionalAttribute可用于根据定义的编译器符号删除对标记方法的调用。 我假设我们不能自己创建这个类,因为编译器必须专门查找它。

我想知道编译器或语言使用的其他类是什么,我们无法自己编码。

  • 编译器查找[ExtensionAttribute]以指示扩展方法(以及包含扩展方法的类)。

  • [DynamicAttribute]用于指示成员应被视为dynamic类型(即使成员类型本身只是object

  • [InternalsVisibleTo]允许一个程序集访问另一个程序集的内部成员。

基本上查看System.Runtime.CompilerServices命名空间,并检查其中的属性……其中许多属性将由编译器专门处理,即使它不是C#编译器(例如,C#编译器不使用DateTimeConstantAttribute )据我所知,但是DecimalConstantAttribute是.C#编译器可能会使用常量DateTime值,即使它不会产生它们……)

除了提到的那些;

 AttributeUsageAttribute 

有特殊的编译器支持,因为它限制(在编译时)如何应用属性

 ObsoleteAttribute 

编译器也使用它来警告或使用错误。

怀疑 ,从技术上讲,你可以自己编写所有这些 – 只要你自己编写核心库和System.dll; p编译器通常会寻找模式/签名 ,因为它必须满足不同的运行时 – 实际上您不必使用MS核心库。 但是, 行为是由编译器定义的,而不是类 – 因此您无法使其执行任何不同的操作。

想到了[SerializableAttribute]。 编译器对其他属性的处理方式不同,我相信它已转换为IL中的特定指令。

编辑以IL for ArgumentException为例,类定义如下所示:

 .class public auto ansi serializable beforefieldinit ArgumentException 

注意*’serializable’修饰符。 通常使用一个属性,您可能会看到类似下面的内容,但它不存在:

 .custom instance void System.SerializableAttribute::.ctor() = (