【发布时间】:2018-01-28 06:45:20
【问题描述】:
在我的应用程序中,我遇到了我无法理解的自定义属性和反射的奇怪情况,我试图减少问题。假设我有以下自定义属性:
class A : Attribute
{
public virtual string SayHi()
{
return "Hi From A";
}
}
class B : A
{
public override string SayHi()
{
return "Hi From B";
}
}
以下类用自定义属性装饰:
[A]
class X
{ }
[B]
class Y
{ }
在下面的方法中,我将用“A”属性修饰的每种类型的类映射到一个函数,该函数返回其自定义属性返回的值:
static Dictionary<Type, Func<string>> dic = new Dictionary<Type, Func<string>>();
static void func()
{
A attr;
foreach (var type in typeof(Program).Assembly.GetTypes())
{
var attrs = type.GetCustomAttributes(typeof(A)).ToList();
if(attrs.Any())
{
attr = attrs.First() as A;
dic.Add(type, () => attr.SayHi());
}
}
}
映射到 X 类型的函数可能会返回“Hi From A”,但奇怪的是,以下代码将“Hi From B”打印到控制台!
func();
Console.WriteLine(dic[typeof(X)]());
我是否缺少语言功能?
【问题讨论】:
-
“我错过了语言功能吗?” -- 你犯了经典的“多次捕获同一个变量”错误。见标记重复。您需要在循环中声明
attrinside,以便添加到字典中的每个 lambda 都使用不同的变量。
标签: c# reflection custom-attributes