尝试在同一类中使用反射来调用方法
Posted
技术标签:
【中文标题】尝试在同一类中使用反射来调用方法【英文标题】:Trying to use Reflection to Invoke Method within same class 【发布时间】:2010-07-08 04:26:25 【问题描述】:我有一个 WCF 服务,它接受一个对象作为具有 URI 和方法名称的参数。 我想要做的是有一个看起来@URI的方法,如果它包含单词“localhost”,它将使用反射并调用一个方法,该方法的名称作为参数传入,在同一个类中,返回一个值并继续。
public class Test
public GetStatResponse GetStat(GetStatRequest request)
GetStatResponse returnValue = new GetStatResponse();
if(Helpers.Contains(request.ServiceURI,"localhost", StringComparison.OrdinalIgnoreCase))
MethodInfo mi = this.GetType().GetMethod(request.ServiceMethod /*, BindingFlags.Public | BindingFlags.IgnoreCase*/);
returnValue = (GetStatResponse)mi.Invoke(this,null);
以上是与本题相关的代码段。我拉 MethodInfo 没问题,但我在 mi.Invoke 上遇到了问题。我收到的异常是“调用的目标已抛出异常”。带有内部异常“对象引用未设置为对象的实例”。我尝试将代码更改为 (GetStatResponse)mi.Invoke(new Test(), null),但没有成功。测试是类。
我对如何解决这个问题的其他建议持开放态度,我只是认为反思可能是最简单的。
我在测试中调用的方法定义为
public GetStatResponse TestMethod()
GetStatResponse returnValue = new GetStatResponse();
Stat stat = new Stat();
Stat.Label = "This is my label";
Stat.ToolTip = "This is my tooltip";
Stat.Value = "this is my value";
returnValue.Stat = stat;
return returnValue;
【问题讨论】:
目标方法是否需要任何参数? 目标方法没有参数 【参考方案1】:在调用该方法之前,您可能需要确保您通过反射提取的MethodInfo 不为空:
MethodInfo mi = this.GetType().GetMethod(
request.ServiceMethod,
BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase
);
// Make sure that the method exists before trying to call it
if (mi != null)
returnValue = (GetStatResponse)mi.Invoke(this, null);
在您更新之后,似乎在您调用的方法中引发了异常:
GetStatResponse returnValue = new GetStatResponse();
// Don't forget to initialize returnValue.Stat before using it:
returnValue.Stat = new WhateverTheTypeIs();
returnValue.Stat.Label = "This is my label";
【讨论】:
谢谢,好建议。在我的测试中,我指定了方法,并且 MethodInfo 正在被正确检索。 找到引发此异常的确切行。它可能在方法本身内部吗? 抛出异常的确切行是 returnValue = (GetStatResponse)mi.Invoke(this, null) 我正在调用的方法现在在我的原始帖子中定义。 在您调用的方法中,我看不到您在哪里初始化returnValue.Stat
属性。你写了returnValue.Stat.Label
,因为returnValue.Stat
是空的。
请一步步调试你的代码,看看到底哪里抛出了异常。哪条线?【参考方案2】:
因为您没有在 GetMethod() 调用中指定 BindingFlags,所以只会返回与包含 request.ServiceMethod 的名称相匹配的 PUBLIC 方法。
检查你尝试调用的方法是否是公共的,否则 MethodInfo 将返回 null。
如果它不是公开的,请将方法设为公开或包含 BindingFlags.NonPublic 标志。
此外,在调用 mi.Invoke 之前,您应该始终确保 mi != null
【讨论】:
我调用的方法是公开的。我在那里有 BindingFlags,我只是将它们注释掉。取消注释它们仍然会产生相同的结果。以上是关于尝试在同一类中使用反射来调用方法的主要内容,如果未能解决你的问题,请参考以下文章