尝试在同一类中使用反射来调用方法

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,我只是将它们注释掉。取消注释它们仍然会产生相同的结果。

以上是关于尝试在同一类中使用反射来调用方法的主要内容,如果未能解决你的问题,请参考以下文章

通过反射调用动态调用方法

如何在同一个类中调用两个方法?

PHP通过反射方法调用执行类中的私有方法

Java反射机制demo—获得并调用一个类中的方法

同一个类中的同名函数 - 有没有一种优雅的方法来确定调用哪个?

在同一个类中调用UIButton AddTarget