Переопределить поведение по умолчанию 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)
    {

    }
}

Цель в том, что я хотел бы знать, например, "button1_click" в GetEnumerator() метод

2 ответа

Решение

Я не думаю, что можно делать именно то, что вы хотите сделать, так как 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())
{
    //..
}

Похоже, вам нужно использовать 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);
        }
Другие вопросы по тегам