2013-03-21 100 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