Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c# execute a string as code

Here is what i want to do, and i know it is possible with perl, php, python and java, but i am working with c#

how can i do the following:

public void amethod(string functionName)
{
    AVeryLargeWebServiceWithLotsOfMethodsToCall.getFunctionName();
}

I want to pass the functionName to the method and I want it to be executed as above.

How this can be done?

Do i need ANTLR or any other tool for this?

Thanks.

like image 445
DarthVader Avatar asked Oct 02 '09 19:10

DarthVader


3 Answers

You can execute a method by name via Reflection. You need to know the type, as well as the method name (which can be the current object's type, or a method on a different object, or a static type). It looks like you want something like:

public void amethod(string functionName) 
{
    Type type = typeof(AVeryLargeWebServiceWithLotsOfMethodsToCall);
    MethodInfo method = type.GetMethod(functionName, BindingFlags.Public | BindingFlags.Static);
    method.Invoke(null,null); // Static methods, with no parameters
}

Edit in response to comment:

It sounds like you actually want to get a result back from this method. If that's the case, given that it's still a static method on the service (which is my guess, given what you wrote), you can do this. MethodInfo.Invoke will return the method's return value as an Object directly, so, if, for example, you were returning a string, you could do:

public string amethod(string functionName) 
{
    Type type = typeof(AVeryLargeWebServiceWithLotsOfMethodsToCall);
    MethodInfo method = type.GetMethod(functionName, BindingFlags.Public | BindingFlags.Static);
    object result = method.Invoke(null,null); // Static methods, with no parameters
    if (result == null)
        return string.Empty;
    return result.ToString();
    // Could also be return (int)result;, if it was an integer (boxed to an object), etc.
}
like image 123
Reed Copsey Avatar answered Sep 25 '22 05:09

Reed Copsey


Executing a string as if it were code is possible in c#, but it's not pretty or simple. It's also considered poor practice and insecure (you probably should avoid it in dynamic languages, too).

Instead, do something like this:

public void amethod(Action actionParam)
{
    actionParam();
}

Now, in your case you want to call a web service. Since that ultimately comes down to xml anyway you have a couple options:

  • Bypass the built-in system for calling web services and create your own web request with the correct name in the correct place in the xml.
  • Create delegates for each of the methods in the service to pass around, possibly via reflection.
like image 35
Joel Coehoorn Avatar answered Sep 24 '22 05:09

Joel Coehoorn


Are you saying that AVeryLargeWebServiceWithLotsOfMethodsToCall is an instance of an object on which you want to invoke a method named functionName? If so:

MethodInfo method = AVeryLargeWebServiceWithLotsOfMethodsToCall.GetType().GetMethod(functionName);
method.Invoke(AVeryLargerWebServiceWithLotsOfMethodsToCall, null);

Or is AVeryLargeWebServiceWithLotsOfMethodsToCall a type on which you want to invoke a static method named functionName? If so:

MethodInfo method = typeof(AVeryLargeWebServiceWithLotsOfMethodsToCall).GetMethod(functionName);
method.Invoke(null, null);
like image 34
jason Avatar answered Sep 22 '22 05:09

jason