これは C# 4.0 です。
WeakReference私はそのようないくつかの s に sを格納するクラスを持ってActionいます:
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私のアプリケーションでは 3 番目のクラスです。
私の質問:
メソッドで、渡されたパラメーターが匿名メソッド ( ) を参照しているか、具象メソッド ( ) を参照しKeepReferenceているかをどのように確認できますか?Actionthis.Bar = b;this.Whatever
のプロパティを確認しましたaction。action(のようなIsAbstract) の種類のプロパティが見つかりませんでしたIsAnonymous。コンパイル後にildasmで匿名メソッドが通常のメソッドに「なった」ことがわかるので、基になる型はMethodInfo理にかなっていFoobarます。Ildasm では、匿名メソッドが完全なピンク色の四角形ではなく、ピンク色で囲まれた白い四角形であることもわかります。その定義には、いくつかの CompilerServices クラスへの呼び出しがありますが、C# でこれを利用する方法がわかりません。の本質を知ることができると確信していactionます。私は何が欠けていますか?