0

attributes メソッド本体内でサポートされていないことは知っていますが、誰かがこれを回避している可能性があることを知りたかったのです。私が興味を持っているのはcustom Attribute、メソッド本体と 2 つのものの中に入ることを可能にする手法です。

  1. クラス強化 (オブジェクトの作成Foo foo = new Foo())
  2. そのオブジェクトが特定の関数を呼び出すとき ( foo.bar())

metadata後で、 を使用して入力した のをattributes使用する予定reflectionです。私は実際にそうしなけれextented c#ばならないと主張する人々のグループに出くわしましたが、ダウンロードできないため、それを確認することはできません.

ここに彼らの研究論文へのリンクがあります Freely Annotating c# 解決策を教えてください

アップデート

さらにリフレクションを使用すると、クラス Foo とそのメソッド bar の名前は既にわかっています。これの目的は、foo が何らかのメソッドで bar() を呼び出したことを知ることです。

例えば

   static void Main()
       {
           [p1inst]  
           ConcretePrototype1 p1 = new ConcretePrototype1("I");

           [p1call]  
           ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();
           Console.WriteLine("Cloned: {0}", c1.Id);

           // Wait for user 
           Console.Read();
       }

上記は結果を示す例です。現時点では、コンパイラがエラーを出すため実行できません。しかし、上記の研究論文の著者は、メソッド本体内の属性を許可するためにこれを行ったと主張しています

全体のポイントは、いくつかのメソッドでタイプのオブジェクトがFOO存在し、そのオブジェクトが呼び出されたbar()かどうかを識別することです

4

2 に答える 2

1

あなたは間違った方向に進んでいると思います。メソッド内に属性を持つことはできません。論文を完全に読んでいないか、いくつかのポイントを見逃しています。

それは単に翻訳するソースからソースへのコンパイラについて語っています

public void m() {
    Console.WriteLine("Parallelable code sample");
    [Parallel("Begin of a parallel block")] {
        Console.WriteLine("Code exec by the main thread");
        [Process("First process")] { /∗ Computation here ∗/ }
        [Process] { /∗ Computation here ∗/ }
    }
    Console.WriteLine("Here is sequential");
}

この C# コードに:

[Parallel("Parallelable code sample", ACSIndex=1)]
[Process("First process", ACSIndex=2)]
[Process(ACSIndex=3)]
public void m() {
    Console.WriteLine("Parallelable code sample");
    Annotation.Begin(1); { // [Parallel]
        Console.WriteLine("Code exec by the main thread");
        Annotation.Begin(2); /∗ [Process("First process")] ∗/ { · · · }
        Annotation.End(2);
        Annotation.Begin(3); /∗ [Process] ∗/ { · · · }
        Annotation.End(3);
    } 
    Annotation.End(1);
}

そのため、メソッドBegin(1)がクラスで呼び出されるとAnnotation、メソッド属性を でルックアップするだけASCIndex=1です。


実際の問題を解決するには、 StackTraceクラスを調べる必要があります。

例:

void Main()
{
    var f = new FooClass();
    f.Foo();
}

class BarClass
{
    public static void Bar()
    {
        var st = new StackTrace();
        var frame = st.GetFrame(1);
        var m = frame.GetMethod();
        Console.WriteLine(String.Format("'{0}' called me from '{1}'", m.DeclaringType.Name, m));
    }
}

class FooClass
{
    public void Foo()
    {
        BarClass.Bar();
    }
}

出力:

「FooClass」が「Void Foo()」から私を呼び出しました

于 2012-08-02T06:29:35.993 に答える
0

メソッド名をキーとしてクラスにディクショナリを追加できます...リフレクションによるメソッドでは、メソッド名を見つけて、属性を含むディクショナリで一致する値を検索できます。

メソッド名を辞書にキーとして事前に追加する必要さえないと思います。関数を初めて実行するときにそれらをそこに置くことができます。

于 2012-08-02T06:11:06.680 に答える