Type.GetMethod返回“对象引用未设置为对象的实例”。

时间:2013-01-31 00:42:36

标签: c# visual-studio-2012

有一天,当我遇到问题时,我正在尝试使用Type.GetMethod方法。

我的程序是Windows应用程序。在用于输出的表单中有一个文本框,Form1_Load方法中只有这两个代码块:

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

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

第一个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;
        }

第二个GetMethod现在给我错误:

Object reference not set to an instance of an object.

我很困惑。这两种方法都不是静态的,也不采用任何参数。为什么MoveInxt会在GetEnumerator没有时返回错误?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

我看到了这个:

  

但第二个没有返回。

这意味着第二对的第二行,就像你试图这样做:

null.ToString();

这就是异常的来源,而不是它上面的那一行。您不能使用这样的null对象的属性或方法。