它们是存储在类方法还是实例化方法中?还是两者兼而有之?我真的在寻找一个解释,经过大量研究后我无法得出明确的答案。
由于
答案 0 :(得分:14)
在这里求精度,程序集中使用的所有[属性]都由编译器收集在一起并写入程序集的元数据。元数据播放中的两个表是角色。
第一个是CustomAttribute表,它包含每个属性的列表。列表条目具有原始声明的索引,该索引具有属性(1),对属性类型(2)的构造函数的引用以及用于在运行时构造属性对象的值的索引(3)。 / p>
第二个是Blob表,CustomAttribute表中的值索引(3)将其编入索引。它包含您在属性声明中使用的值。如果使用字符串或typeof参数,则这些值是字符串;如果使用值类型值参数,则为实际值;如果使用数组,则为这些值的数组。
在运行时构造属性对象因此首先要通过(1)在CustomAttribute数组中找到该条目。然后使用(2)定位属性类的构造函数,并在必要时对其进行jit编译。 (3)用于查找blob表中的条目,根据需要转换blob中的值,例如从字符串中检索Type,创建数组等。并调用构造函数来创建对象。
以这种方式组织它具有很大的优势,即声明可以具有任意数量的属性,并且该属性可以用于多种声明(程序集,类型,方法,参数,字段等)。缺点是找回它们并不是特别便宜。
答案 1 :(得分:1)
类属性存储在与类关联的Type
对象中。
Object x;
System.Reflection.TypeAttributes attributes = x.GetType().Attributes;
所以你的问题的答案是:真的没有这些,因为他们不是这类课程的一部分。
点击此处查看更多信息:http://msdn.microsoft.com/en-us/library/system.type.attributes.aspx
答案 2 :(得分:1)
正如knittl在评论中所评论的(这是正确的)你可以查看MSDN:
.NET Framework允许您声明特定类型的元数据,称为 属性,在已编译的文件中。属性可以在整个过程中找到 .NET Framework,用于更详细地控制您的 程序在运行时运行。此外,您可以自己发射 通过用户定义的自定义将自定义元数据导入.NET Framework文件 属性。有关更多信息,请参阅使用扩展元数据 属性。
来自docs (CLI分区II - 元数据和文件格式(word / pdf zip)): -
类型及其成员的属性附加描述性信息 他们的定义。最常见的属性是预定义的 在与其关联的元数据中具有特定编码(第23节)。 此外,元数据提供了附加用户定义的方法 属性到元数据,使用几种不同的编码。
来自MSDN:
您可以使用Type类的成员来获取个人 传递类中的方法和成员。这个例子首先查询 Type对象获取类级别的属性信息。 接下来,它使用Type.GetMethods将所有方法的实例放入 要检索属性的System.Reflection.MemberInfo对象数组 方法级别的信息。你也可以使用 Type.GetProperties方法检查属性上的属性 level或Type.GetConstructors来检查属性 构造函数级别。
答案 3 :(得分:1)
简而言之,它们存储在IL
中,这是使用IL Disassembler看到的[Serializable]
中IL
属性的示例。