7

これは 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

のプロパティを確認しましたactionaction(のようなIsAbstract) の種類のプロパティが見つかりませんでしたIsAnonymous。コンパイル後にildasmで匿名メソッドが通常のメソッドに「なった」ことがわかるので、基になる型はMethodInfo理にかなっていFoobarます。Ildasm では、匿名メソッドが完全なピンク色の四角形ではなく、ピンク色で囲まれた白い四角形であることもわかります。その定義には、いくつかの CompilerServices クラスへの呼び出しがありますが、C# でこれを利用する方法がわかりません。の本質を知ることができると確信していactionます。私は何が欠けていますか?

4

2 に答える 2

4

この質問に対して「承認された」回答を得るために、私の質問に対する最初のコメントでMichael Kjörlingが提供したリンクに従って行きました。

if (action.Target.GetType().GetMethods().Where(method => method.GetCustomAttributes(typeof(CompilerGeneratedAttribute), false).Any()).Contains(action.Method))
{
    // ...
}
于 2012-10-15T17:41:38.483 に答える
2

コンパイラで生成されたメソッドには、常に以下のように山括弧が付いた名前が付けられます

Void <Main>b__0()

そのため、名前を取得して、角かっこが含まれているかどうかを確認してください。

Action someaction = () => Console.Write("test");
string methodName= RuntimeReflectionExtensions.GetMethodInfo(someaction).ToString();

if(methodName.Contains("<"))
  Console.write("anonymous");

または、正規表現でより優れたパターンマッチングを使用できます

于 2012-10-06T09:09:28.480 に答える