繁体   English   中英

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

[英]Type.GetMethod returns “Object reference not set to an instance of an object.”

有一天,当我遇到问题时,我正在尝试使用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没有的情况下返回错误?

这是因为接口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;

我看见了这个:

但第二个没有返回。

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

null.ToString();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM