Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use reflection to call method by name

Tags:

Hi I am trying to use C# reflection to call a method that is passed a parameter and in return passes back a result. How can I do that? I've tried a couple of things but with no success. I'm used to PHP and Python where this can be done on a single line so this is very confusing to me.

In essence this is how the call would be made without reflection:

response = service.CreateAmbience(request); 

request has these objects:

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"]); 

This is my function to implement the reflection where serviceAction for the case above would be "CreateAmbience":

public static R ResponseHelper<T,R>(T request, String serviceAction) {     ICMSCoreContentService service = new ContentServiceRef.CMSCoreContentServiceClient();     R response = default(R);     response = ??? } 
like image 344
Martin Avatar asked Jun 24 '10 13:06

Martin


People also ask

How do I invoke a reflection API method?

First, to find the main() method the code searches for a class with the name "main" with a single parameter that is an array of String Since main() is static , null is the first argument to Method. invoke() . The second argument is the array of arguments to be passed.

How do you call a method by class name?

A method must be created in the class with the name of the method, followed by parentheses (). The method definition consists of a method header and method body. We can call a method by using the following: method_name(); //non static method calling.


1 Answers

Something along the lines of:

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

You may well want to add checks at each level though, to make sure the method in question is actually valid, that it has the right parameter types, and that it's got the right return type. This should be enough to get you started though.

like image 85
Jon Skeet Avatar answered Oct 27 '22 09:10

Jon Skeet