有一天,当我遇到问题时,我正在尝试使用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没有时返回错误?
答案 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对象的属性或方法。