代码之家  ›  专栏  ›  技术社区  ›  Martin

如何使用反射按名称调用方法

  •  18
  • Martin  · 技术社区  · 14 年前

    嗨,我正在尝试使用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 = ???
    }
    
    4 回复  |  直到 14 年前
        1
  •  44
  •   Jon Skeet    14 年前

    沿着以下几条线的东西:

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

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

        2
  •  11
  •   Brian Scott    14 年前

    下面是使用反射按名称调用对象方法的快速示例:

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

    如果您在.NET 4上,请使用 dynamic :

    dynamic dService = service;
    var response = dService.CreateAmbience(request);
    
        4
  •  3
  •   dtb    14 年前

    你可以使用 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);
    }