【问题标题】:How to use reflection to call method by name如何使用反射按名称调用方法
【发布时间】:2010-06-24 13:20:51
【问题描述】:

您好,我正在尝试使用 C# 反射来调用传递参数并返回结果的方法。我怎样才能做到这一点?我尝试了几件事,但没有成功。我习惯了 PHP 和 Python,这可以在一行上完成,所以这让我很困惑。

本质上,这就是在没有反射的情况下进行调用的方式:

response = service.CreateAmbience(request);

请求有这些对象:

request.UserId = (long)Constants.defaultAmbience["UserId"];
request.Ambience.CountryId = (long[])Constants.defaultAmbience["CountryId"];
request.Ambience.Name.DefaultText = (string)Constants.defaultAmbience["NameDefaultText"];
request.Ambience.Name.LanguageText = GetCultureTextLanguageText((string)Constants.defaultAmbience["NameCulture"], (string)Constants.defaultAmbience["NameText"]);
request.Ambience.Description.DefaultText = (string)Constants.defaultAmbience["DescriptionText"];
request.Ambience.Description.LanguageText = GetCultureTextLanguageText((string)Constants.defaultAmbience["DescriptionCulture"], (string)Constants.defaultAmbience["DescriptionDefaultText"]);

这是我实现反射的函数,上面案例的 serviceAction 将是“CreateAmbience”:

public static R ResponseHelper<T,R>(T request, String serviceAction)
{
    ICMSCoreContentService service = new ContentServiceRef.CMSCoreContentServiceClient();
    R response = default(R);
    response = ???
}

【问题讨论】:

    标签: c# reflection


    【解决方案1】:

    类似的东西:

    MethodInfo method = service.GetType().GetMethod(serviceAction);
    object result = method.Invoke(service, new object[] { request });
    return (R) result;
    

    您可能希望在每个级别添加检查,以确保所讨论的方法实际上是有效的,它具有正确的参数类型,并且它具有正确的返回类型。不过,这应该足以让您入门。

    【讨论】:

    • 谢谢乔恩,我现在正在尝试,但在“object result = method.Invoke(service, new object[] { request });”行出现错误- 参数计数不匹配。
    • 我已经解决了。您的解决方案有效,但反射没有选择采用 1 个参数的服务包装器。感谢您的帮助。
    【解决方案2】:

    这是一个使用反射按名称调用对象方法的快速示例:

    Type thisType = <your object>.GetType();
    MethodInfo theMethod = thisType.GetMethod(<The Method Name>); 
    theMethod.Invoke(this, <an object [] of parameters or null>); 
    

    【讨论】:

      【解决方案3】:

      如果您使用 .NET 4,请使用 dynamic

      dynamic dService = service;
      var response = dService.CreateAmbience(request);
      

      【讨论】:

        【解决方案4】:

        您可以使用Delegate.CreateDelegate 按名称获取方法的委托:

        public static R ResponseHelper<T,R>(T request, string serviceAction)
        {
            var service = new ContentServiceRef.CMSCoreContentServiceClient();
        
            var func = (Func<T,R>)Delegate.CreateDelegate(typeof(Func<T,R>),
                                                          service,
                                                          serviceAction);
        
            return func(request);
        }
        

        【讨论】:

          猜你喜欢
          • 2011-07-18
          • 2013-09-18
          • 1970-01-01
          • 2012-11-16
          • 2011-03-06
          • 2018-02-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多