这是 C# 4.0。
我有一个类将 s 存储在这样WeakReference
的一些Action
s 上:
public class LoremIpsum
{
private Dictionary<Type, List<WeakReference>> references = new Dictionary<Type, List<WeakReference>>();
public void KeepReference<T>(Action<T> action)
{
if (this.references.ContainsKey(typeof(T)))
{
this.references[typeof(T)].Add(new WeakReference(action));
}
else
{
this.references.Add(typeof(T), new List<WeakReference> { new WeakReference(action) });
}
}
}
这个类有另一个方法允许执行Action
稍后传递给它的 s ,但它在这个问题中并不重要。
我以这种方式消费这个类:
public class Foobar
{
public Bar Bar { get; set; }
public void Foo(LoremIpsum ipsum)
{
ipsum.KeepReference<Bar>((b) => { this.Bar = b; });
ipsum.KeepReference<Bar>(this.Whatever);
}
public void Whatever(Bar bar)
{
// Do anything, for example...:
this.Bar = bar
}
}
Bar
在我的申请中是第三类。
我的问题:
在KeepReference
方法中,如何知道Action
传入的参数是指匿名方法(this.Bar = b;
)还是具体方法(this.Whatever
)?
我检查了action
. action
我在(like IsAbstract
)上找不到任何属性IsAnonymous
。底层类型是MethodInfo
有意义的,因为编译后我可以在 ildasm 中看到匿名方法“成为” Foobar
. 在 ildasm 中,我还可以看到匿名方法不是一个完整的粉红色方块,而是一个被粉红色包围的白色方块,并且在其定义中调用了一些 CompilerServices 类,但我不知道如何在 C# 中利用这一点。我相信有可能了解action
. 我错过了什么?