1

先日、問題が発生したときにType.GetMethodメソッドを試していました。

私のプログラムはWindowsアプリケーションです。出力に使用されるフォームには1つのテキストボックスがあり、Form1_Loadメソッドには次の2つのコードブロックしかありません。

   MethodInfo info2 = typeof(IEnumerable<int>).GetMethod("GetEnumerator");
   textBox1.Text += info2.ToString();

   MethodInfo info1 = typeof(IEnumerator<int>).GetMethod("MoveNext");
   textBox1.Text += info1.ToString();

最初のGetMethodは正しい情報を返しましたが、2番目のGetMethodは何も返しませんでした。

そこで、さらに一歩進んで、コードにtry/catchステートメントを含めました。

        try
        {
            MethodInfo info2 = typeof(IEnumerable<int>).GetMethod("GetEnumerator");
            textBox1.Text += info2.ToString();

            MethodInfo info1 = typeof(IEnumerator<int>).GetMethod("MoveNext");
            textBox1.Text += info1.ToString();
        }
        catch (Exception v)
        {
            textBox1.Text += v.Message;
        }

2番目のGetMethodで、次のエラーが発生します。

Object reference not set to an instance of an object.

私は混乱しています。どちらのメソッドも静的ではなく、パラメーターも取りません。GetEnumeratorが返さないのに、MoveNextがエラーを返すのはなぜですか?

4

2 に答える 2

3

これは、インターフェイスIEnumerator<T>に、の定義がないためです。MoveNextつまり、インターフェイスにありますIEnumerator

例:

   MethodInfo info1 = typeof(IEnumerator).GetMethod("MoveNext");
   textBox1.Text += info1.ToString();

これはうまくいきます、

に割り当てられたインターフェイスをループしIEnumerator<T>て検索できますMoveNext

MethodInfo info1 = typeof(IEnumerator<int>).GetInterfaces()
                  .Where(i => i.GetMethod("MoveNext") != null)
                  .Select(m => m.GetMethod("MoveNext"))
                  .FirstOrDefault();
textBox1.Text += info1 != null ? info1.ToString() : string.Empty;
于 2013-01-31T01:18:43.180 に答える
0

これを見た:

しかし、2番目のものは何も返しませんでした。

つまり、2番目のペアの2行目は、これを実行しようとしていたようです。

null.ToString();

例外は、その上の行ではなく、そこから発生します。そのようなnullオブジェクトのプロパティやメソッドを使用することはできません。

于 2013-01-31T00:52:16.837 に答える