2008-11-20 45 views
0

运行下面的代码时,尽管存在具有正确属性分配的类,但永远不会返回类型。事实上,ATTR阵列总是具有0查找属性附加到类型的问题

Assembly a = Assembly.LoadFile(file); 
foreach (Type t in a.GetTypes()) 
{ 
    object[] attr = t.GetCustomAttributes(typeof(SchemeNameAttribute), false); 

    foreach (object attribute in attr) 
    { 
     SchemeNameAttribute schemeName = attribute as SchemeNameAttribute; 
     if (schemeName != null && schemeName.Name.ToLower() == brickName.ToLower()) 
     { 
      return t; 
     } 
    } 
} 

的长度如果我改变它的使用方法:

object[] attr = t.GetCustomAttributes(false); 

然后它拿起类型SchemeNameAttribute为类型之一的自定义属性,但

SchemeNameAttribute schemeName = attribute as SchemeNameAttribute; 

始终为schemeName返回空值。

任何想法?

回答

2

您混合了加载程序集的两个不同上下文:运行应用程序的“加载上下文”,以及使用LoadFile加载辅助程序集的“无上下文”。您想阅读thisthat文章以了解加载上下文的想法。这里最重要的部分是将程序集加载到不同的上下文中,即使是从相同的位置,也被认为是不同的。因此,他们的类型被认为是不同的。因此,在您的加载的程序集中键入SchemeNameAttribute与应用程序中的SchemeNameAttribute类型不同。

0

我怀疑你已经重新声明了属性 - 即SchemeNameAttribute类型在两个程序集中声明(分开)(可能通过复制.cs)。这不行;类型的范围是由它们的程序集确定的,因此Foo.dll中的SchemeNameAttribute与Bar.dll/Bar.exe中的SchemeNameAttribute类型不同。

您应该确保SchemeNameAttribute类型只声明一次 - 如果需要,可以将它移动到现有程序集可引用的dll。

相关问题