我在阅读一种类型的CustomAttributes
时遇到了问题。
TypeInfo mytype = ...
IEnumerable<CustomAttributeData> customAttributes = null;
try
{
customAttributes = mytype.CustomAttributes; // Or GetCustomAttributesData
} catch (TypeLoadException e)
{
// Could not access the attributes
throw new Exception("Type not loaded for the attribute", e);
}
我在TypeLoadException e
中遇到的错误是:
无法加载类型 'System.Runtime.CompilerServices.ScriptNamespaceAttribute'来自 assembly'mscorlib,Version = 4.0.0.0,Culture = neutral, 公钥= b77a5c561934e089' 。
关键是e.TypeName
具有我为该类型使用的属性类的名称,因此该名称实际可用!
我使用以下方法加载了程序集:
Assembly.ReflectionOnlyLoadFrom("Path to my assembly")
所以我期待能够访问类型并至少读取他们的名字。它发生在类和其他类型中,但对于自定义属性,我遇到了这个问题。但是,如果我打开ILDASM(我的程序集上的.NET反汇编程序)。我可以看到ScriptNamespaceAttribute
被应用于程序集中定义的某些类。
在MSDN GetCustomAtrributesData我可以看到:
在自定义属性本身是在加载到仅反射上下文的代码中定义的情况下,使用此方法检查仅反射上下文中的代码的自定义属性。像Attribute.GetCustomAttributes和MemberInfo.GetCustomAttributes这样的方法在这种情况下不能使用,因为它们会创建属性的实例。
它基本上是否意味着我无法只读取这些自定义属性的名称?我不想要更多,我只需要知道自定义属性的名称......
如何安全地读取引用外部定义类型的程序集中的自定义属性?我不需要为这些类实现,只需要他们的名字。