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

时间:2010-06-24 13:20:51

标签: c# reflection

您好我正在尝试使用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 个答案:

答案 0 :(得分:45)

有些事情:

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

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

答案 1 :(得分:11)

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

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

答案 2 :(得分:3)

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

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

答案 3 :(得分: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);
}