覆盖GetEnumerator的默认行为

时间:2013-03-21 11:03:35

标签: c# list ienumerable ienumerator callermembername

我有一个要求,我需要知道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)
    {

    }
}

目标是我想知道"button1_click"方法中的GetEnumerator()

2 个答案:

答案 0 :(得分:1)

我认为不可能完全按照你想做的去做,因为foreach据我所知,总是在没有任何参数的情况下调用GetEnumerator()。但是,我认为你的问题有两种可能性

您可以使用StackTrace来获取调用方法:

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

或者您可以使用其他方法,而不是使用GetEnumerator()属性的[CallerMemberName]

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

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

答案 1 :(得分:0)

似乎,你需要使用StackTrace Class

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