2

への呼び出し方法を知る必要があるという要件があります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()

4

2 に答える 2

2

foreach私の知る限り、常にGetEnumerator()引数なしで呼び出しているので、あなたがやりたいことを正確に行うことは不可能だと思います。しかし、私はあなたの問題に2つの可能性を見ています

を使用し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())
{
    //..
}
于 2013-03-21T11:32:39.087 に答える
0

のように思えますが、StackTrace クラスを使用する必要があります

StackTrace st = new StackTrace();
        var fr = st.GetFrames();
        if(fr != null && fr.Any() &&fr.Count() >1)
        {
            MessageBox.Show(fr.ElementAt(1).GetMethod().Name);
        }
于 2013-03-21T11:38:23.430 に答える