如何使用反射通过名称调用方法

26

你好,我正在尝试使用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个回答

54

差不多就是这样:

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

你可能需要在每个级别上添加检查,以确保所涉及的方法实际上是有效的,具有正确的参数类型和正确的返回类型。虽然如此,这应该足以让你开始了。


谢谢Jon,我现在正在尝试,但是在"object result = method.Invoke(service, new object[] { request });"这一行上出现了错误——参数计数不匹配。 - Martin
我已经解决了。你的解决方案是可行的,但是反射没有捕获到只有一个参数的服务包装器。感谢你的帮助。 - Martin

15

这是使用反射调用对象方法的快速示例:

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

4

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接