2012-08-02 69 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