C# Attribute的实例化时机

2017年1月27日

谁说Attribute特性的实例化是在编译时发生的?

测试以下代码


using System;
using System.Linq;

namespace ConsoleApplication1
{
  [MyAttribute("Good")]
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine("hello world");
      //var myAttribute = typeof(Program).GetCustomAttributes(typeof(MyAttributeAttribute), false).FirstOrDefault() as MyAttributeAttribute;
      //Console.WriteLine(myAttribute.Name);
      Console.ReadKey();
    }
  }


  [System.AttributeUsage(System.AttributeTargets.Class, Inherited = false, AllowMultiple = true)]
  sealed class MyAttributeAttribute : Attribute
  {
    public string Name { get; set; }

    // This is a positional argument
    public MyAttributeAttribute(string name)
    {
      Name = name;
      throw new NotImplementedException();
    }
    
  }

}

我在特性的构造函数中抛出异常,但是编译时并没有异常,说明特性并不是在编译时实例化的。

如果我对中间两行取消注释,则运行时抛出了异常。