【问题标题】:Problems finding an attribute attached to a Type查找附加到类型的属性时出现问题
【发布时间】:2008-11-20 08:55:20
【问题描述】:

运行以下代码时,永远不会返回类型,尽管已分配了正确属性的类。事实上,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 返回一个空值。

有什么想法吗?

【问题讨论】:

    标签: c# .net reflection attributes


    【解决方案1】:

    您混合了加载程序集的两种不同上下文:应用程序在其中运行的“加载上下文”和使用 LoadFile 加载辅助程序集的“无上下文”。您想阅读thisthat 文章以了解有关加载上下文的信息。这里最重要的部分是加载到不同上下文的程序集,即使是从同一个位置,也被认为是不同的。因此它们中的类型被认为是不同的。因此,loaded 程序集中的 SchemeNameAttribute 类型与应用程序中的 SchemeNameAttribute 类型不同。

    【讨论】:

      【解决方案2】:

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

      您应该确保 SchemeNameAttribute 类型只声明一次 - 如有必要,将其移动到两个现有程序集都可以引用的 dll 中。

      【讨论】:

        猜你喜欢
        • 2012-01-02
        • 1970-01-01
        • 2019-12-06
        • 2011-06-16
        • 1970-01-01
        • 2019-11-12
        • 2013-01-12
        • 2015-11-23
        • 1970-01-01
        相关资源
        最近更新 更多