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