gpt4 book ai didi

c# - 无法从 GetCustomAttributes 取回属性

转载 作者:行者123 更新时间:2023-12-04 06:20:20 25 4
gpt4 key购买 nike

在我的解决方案中的 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 调用取回任何属性。我究竟做错了什么?请帮忙。谢谢

最佳答案

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

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 cannot be cast to [B]ClassLibrary1.MyAttribute1. Type A originates from 'ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'LoadFrom' at location 'C:\ClassLibrary1.dll'. Type B originates from 'ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'Default' at location 'C:\Users\Nikola\Documents\Visual Studio 2010\Projects\ConsoleApplication12\ConsoleApplication12\bin\Debug\ClassLibrary1.dll'.

那么,怎么解决呢?

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

查看 this blogpost它处理的问题与您遇到的问题完全相同。阅读有关 load contexts 的内容也可能会有所帮助.

关于c# - 无法从 GetCustomAttributes 取回属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11510703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com