2012-08-02 66 views
0

我知道方法体内不支持attributes,但我想知道也许有人已经解决了这个问题。我感兴趣的是一种技巧,可以让你在方法体内输入custom Attribute,并且可以输入两个东西。方法体内的属性

  1. 类Intensiation(创建对象Foo foo = new Foo()
  2. 当这个对象调用特定功能(foo.bar()

后来我打算用reflection使用进入attributesmetadata。我来到了一群人,他们实际上已经拥有extented c#这样做,但由于无法下载,我无法验证它。

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

UPDATE

进一步反思,我已经知道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()或不是

+1

什么是你想的问题解决?看起来无论是通过向类中添加一个属性都可以更容易地解决,或者,如果您无法修改该类,请使用该属性创建一个包装类。 – TheEvilPenguin 2012-08-02 05:56:08

+0

我不知道我理解你的问题。将元数据与函数关联不会导致在调用该函数时发生任何事情。你将如何处理这个使用反射的元数据?无论你将要在功能体内使用属性*,你也可以使用它所属的函数体的属性元数据*外*。 – 2012-08-02 06:08:04

+0

@ TheEvilPenguin我已经更新了这个问题。你说的方法可以确保调用方法bar()'? – 2012-08-02 06:08:10

回答

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' 叫我从 '无效美孚()'

0

你可以添加一个字典作为键的方法名称的类......在一个方法中的反射,你可以找到方法的名称和方式查找字典中的匹配值,其中将包含您的属性。

我想你甚至不需要在字典中预先添加方法名称作为键;您可以在第一次运行该函数时将它们放在那里。

+0

点是我已经有方法名称我想要的是他们检查Foo类型的对象是否称为bar() – 2012-08-02 06:15:52