如何使用reflection按名称调用方法
您好我正在尝试使用C#reflection来调用传递参数的方法,并作为回报传递回结果。 我怎样才能做到这一点? 我尝试了几件事但没有成功。 我已经习惯了PHP和Python,这可以在一行上完成,所以这对我来说非常困惑。
实质上,这就是如何在没有reflection的情况下进行调用:
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"]);
这是我实现reflection的函数,其中上面的案例的serviceAction将是“CreateAmbience”:
public static R ResponseHelper(T request, String serviceAction) { ICMSCoreContentService service = new ContentServiceRef.CMSCoreContentServiceClient(); R response = default(R); response = ??? }
有点像:
MethodInfo method = service.GetType().GetMethod(serviceAction); object result = method.Invoke(service, new object[] { request }); return (R) result;
您可能希望在每个级别添加检查,以确保相关方法实际上有效,它具有正确的参数类型,并且它具有正确的返回类型。 这应该足以让你开始。
以下是使用reflection按名称调用对象方法的快速示例:
Type thisType = .GetType(); MethodInfo theMethod = thisType.GetMethod(); theMethod.Invoke(this, );
如果您使用的是.NET 4,请使用dynamic
:
dynamic dService = service; var response = dService.CreateAmbience(request);
您可以使用Delegate.CreateDelegate按名称获取方法的委托:
public static R ResponseHelper(T request, string serviceAction) { var service = new ContentServiceRef.CMSCoreContentServiceClient(); var func = (Func)Delegate.CreateDelegate(typeof(Func), service, serviceAction); return func(request); }