2013-03-21 88 views
1

我有一個需求,我需要知道GetEnumerator()的調用方法。覆蓋GetEnumerator的默認行爲

我認爲最好的方式可能會覆蓋默認行爲GetEnumerator我創建的一個,即GetEnumerator([CallerMemberName]string caller = null),但我似乎無法做到這一點,因爲任何調用它仍然會去原來的。一些調用代碼

public class MyItems : IEnumerable<string> 
{ 
    private List<string> items = new List<string>(); 
    public MyItems() 
    { 
     items.Add("One"); 
     items.Add("Two"); 
     items.Add("Three"); 
     items.Add("Four"); 
     items.Add("Five"); 
     items.Add("Six"); 
    } 

    public IEnumerator<string> GetEnumerator() 
    { 
     return items.GetEnumerator(); 
    } 

    public IEnumerator<string> GetEnumerator([CallerMemberName]string caller = null) 
    { 
     var method = caller; 
     return items.GetEnumerator(); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     throw new NotImplementedException(); 
    } 
} 

例子可以

private void button1_click(object sender,EventArgs e) 
{ 
    MyItems items = new MyItems(); 
    foreach (var item in items) 
    { 

    } 
} 

的目的是,我希望在GetEnumerator()方法知道例如"button1_click"

+0

什麼呢主叫代碼是什麼樣子? – Default 2013-03-21 11:06:11

+0

不要直接實現IEnumerable。相反,有一個方法GetEnumerable(字符串調用者),它返回一個IEnumerable並將調用者作爲參數。 – Guillaume 2013-03-21 11:07:33

+0

由於我們正在實現已經實現IEnumerable的接口,因此不實現IEnumerable不是一種選擇。界面是Microsoft IDBSet 界面。我們需要知道來自通用存儲庫的調用方法,以便我們可以做出相應的反應,但是希望保持存儲庫層和DBSets之間的分離等等。 – jclarkson 2013-03-21 11:35:29

回答

1

我不認爲這是可能做到正是你想要做的,因爲foreach,據我所知,總是調用GetEnumerator()沒有任何爭論。但是,我看到兩種可能性,您的問題

可以使用​​獲取調用方法:

public IEnumerator<string> GetEnumerator() 
{ 
    StackTrace stackTrace = new StackTrace(); 
    Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name); 
    return items.GetEnumerator(); 
} 

,或者您可以使用另一種方法來代替它接受[CallerMemberName]屬性GetEnumerator()的。

public IEnumerable<string> Iterate([CallerMemberName]string caller = null) 
{ 
    Console.WriteLine(caller); 
    return items; 
} 

foreach (var myItem in items.Iterate()) 
{ 
    //.. 
} 
+1

StackFrame方法適用於'foreach()',但請注意在'items.Where(...)'它會給''Where''作爲調用者的名字。 – 2013-03-21 11:39:45

+0

此外,我認爲它可能無法在優化後工作:內聯方法,... – Guillaume 2013-03-21 13:18:50

+0

@Guillaume你的意思是與'StackTrace'的第一個方法? – Default 2013-03-21 14:19:25

0

好像,你需要使用堆棧跟蹤類

StackTrace st = new StackTrace(); 
     var fr = st.GetFrames(); 
     if(fr != null && fr.Any() &&fr.Count() >1) 
     { 
      MessageBox.Show(fr.ElementAt(1).GetMethod().Name); 
     } 
+0

不'任何()'意味着有超過0個元素?你真的需要檢查「Count」(如果你這樣做,不應該是'> 0')嗎? – Default 2013-03-21 12:13:08

+0

Count()> 1用於防止fr.ElementAt(1)如果只有一個幀,它將拋出異常 – TalentTuner 2013-03-21 12:16:39

+0

,那麼不需要調用Any()調用 – Lyra 2016-02-08 18:16:13