2

在我的解决方案中的 MiddleTier 项目中,我有 Customer 类,其中一个用 Attribute1 定义

public class Customer2
{
    public string Name2 { get; set; }

    public int Age2 { get; set; }
}

[MyAttribute1]
public class Customer1
{
    [MyAttribute1(DefaultValue = "Must Enter Name")]
    public string Name { get; set; }

    [MyAttribute1(DefaultValue = "Must Enter Age")]
    public int Age { get; set; }
}

[AttributeUsage(AttributeTargets.All)]
public class MyAttribute1 : Attribute
{
    public string DefaultValue { get; set; }

}

在一个单独的项目中,我引用了 MiddleTier DLL,我想枚举此 DLL 中的所有类并识别与 Attribute1 关联的 Customer1 类。

            Assembly assembly =  Assembly.LoadFrom(@"C:\myfolder\MiddleTier\bin\Debug\MiddleTier.dll");

            foreach (Type type in assembly.GetTypes())
            {

                var attribs = type.GetCustomAttributes(typeof(MyAttribute1), false); <--- problem
                if (attribs != null && attribs.Length > 0)
                {
....
                }
            }

GetCustomAttributes调用没有返回任何属性。我究竟做错了什么?请帮忙。谢谢

4

2 回答 2

9

问题是您实际上是从两个不同的位置加载程序集两次。这会导致程序集被加载到两个不同的上下文中,进而导致您的类型不兼容。当您尝试运行此代码时,您可以轻松验证这一点(当然,您需要更改程序集的路径):

foreach (Type type in Assembly.LoadFrom(@"C:\ClassLibrary1.dll").GetTypes())
{
     MyAttribute1 attribute = type.GetCustomAttributes(false)
                                  .Cast<MyAttribute1>()
                                  .SingleOrDefault();
    if (attribute != null)
    {
       Console.WriteLine(type.Name);
    }

}

这将导致引发以下异常:

[A]ClassLibrary1.MyAttribute1 不能转换为 [B]ClassLibrary1.MyAttribute1。类型 A 源自 'ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 在位置 'C:\ClassLibrary1.dll' 的上下文 'LoadFrom' 中。类型 B 源自 'ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 在位置 'C:\Users\Nikola\Documents\Visual Studio 2010\Projects\ConsoleApplication12\ConsoleApplication12\bin 的上下文 'Default' 中\Debug\ClassLibrary1.dll'。

那么,如何解决呢?

您只需使用Assembly.Load("ClassLibrary1"). 这将确保您在单一上下文中工作,并且您的原始代码可以正常工作。

查看这篇博文,它处理了您遇到的完全相同的问题。阅读有关加载上下文的内容也可能会有所帮助。

于 2012-07-16T20:30:49.157 回答
-2

var attribs = (MyAttribute1)type.GetCustomAttributes(typeof(MyAttribute1), false)[someIndex];

于 2012-07-16T18:55:20.843 回答