0

我知道attributes 方法体内不支持它,但我想知道也许有人可以解决这个问题。我感兴趣的是一种允许您进入custom Attribute方法体内部并进入两件事的技术。

  1. 课堂强化(创建对象Foo foo = new Foo()
  2. 当该对象调用特定函数时 ( foo.bar())

稍后我打算使用metadata输入的attributesusing reflection。我遇到了一群人,他们实际上认为他们必须extented c#这样做,但由于没有可下载的,我无法验证它。

这是他们研究论文的链接 Freely Annotating c# 请告诉我解决方案

更新

进一步反思,我已经知道类 Foo 及其方法栏的名称。这样做的目的是知道 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 回答