我有一个要求,我需要知道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()
答案 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);
}