1

前几天遇到问题时,我正在尝试使用 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.

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

4

2 回答 2

3

那是因为interfaceIEnumerator<T>没有定义MoveNext,就是在interface中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

我看到了这个:

但第二个什么也没返回。

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

null.ToString();

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

于 2013-01-31T00:52:16.837 回答