You can access any method by using Expression.Call which creates a MethodCallExpression that represents a call to a method. For example, you have the following code.
string text = "This is simple text.";
Console.WriteLine(text.ToUpper());
Here is the code that is required to build the same functionality using expression tree. In this example, string.ToUpper() is called using an expression to convert a string to an upper case.
string text = "This is simple text.";
Expression callExpr = Expression.Call(
Expression.Constant(text), typeof(String).GetMethod("ToUpper", new Type[] { }));
// The following statement first creates an expression tree,
// then compiles it and then executes it.
Console.WriteLine(Expression.Lambda<Func<String>>(callExpr).Compile()());
You can also call your custom methods using Expression.Call. For example, we have defined the following function which takes two integer arguments and returns the sum of them.
public class MyClass
{
public static int MyFunc(int a, int b)
{
return a + b;
}
}
` The direct way to call this function is straightforward.
Console.WriteLine(MyClass.MyFunc(1,2));
It will return 3 as an output. Now to access this function using expression API, we can use the Expression.Call`.
int param1 = 1;
int param2 = 2;
var c1 = Expression.Constant(param1);
var c2 = Expression.Constant(param2);
var expr = Expression.Call(typeof(MyClass).GetMethod("MyFunc"), c1, c2);
Func<int> func = Expression.Lambda<Func<int>>(expr).Compile();
Console.WriteLine(func.Invoke());