public static Call ( Type type, string methodName, Type typeArguments ) : |
||
type | Type | The |
methodName | string | The name of the method. |
typeArguments | Type |
///An array of |
return |
public static MethodCallExpression Call(Type type, string methodName, Type[] typeArguments, params Expression[] arguments)
{
ContractUtils.RequiresNotNull(type, nameof(type));
ContractUtils.RequiresNotNull(methodName, nameof(methodName));
if (arguments == null) arguments = Array.Empty<Expression>();
BindingFlags flags = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy;
return Expression.Call(null, FindMethod(type, methodName, typeArguments, arguments, flags), arguments);
}
Expression::Call ( |
|
Expression::Call ( |
|
Expression::Call ( |
|
Expression::Call ( |
|
Expression::Call ( |
|
Expression::Call ( |
|
Expression::Call ( |
|
Expression::Call ( |
|
Expression::Call ( |
|
Expression::Call ( |
|
Expression::Call ( |
|
Expression::Call ( |
|
Expression::Call ( |
private static Func <int[], int[]> GenerateCopyExpression() { var ctor = typeof(int[]).GetConstructor(new[] { typeof(int) }); var get = typeof(int[]).GetMethod("Get", new[] { typeof(int) }); var set = typeof(int[]).GetMethod("Set", new[] { typeof(int), typeof(int) }); var p1 = Exp.Parameter(typeof(int[])); var v1 = Exp.Variable(typeof(int[])); var v2 = Exp.Variable(typeof(int)); var @break = Exp.Label(); var block = Exp.Block( new[] { v1, v2 }, Exp.Assign(v1, Exp.New(ctor, Exp.Property(p1, "Length"))), Exp.Assign(v2, Exp.Constant(0)), Exp.Loop( Exp.IfThenElse( Exp.LessThan(v2, Exp.Property(p1, "Length")), Exp.Block( Exp.Call(v1, set, v2, Exp.Call(p1, get, v2)), Exp.AddAssign(v2, Exp.Constant(1)) ), Exp.Break(@break) ), @break), v1 ); return(Exp.Lambda <Func <int[], int[]> >(block, new ParameterExpression[] { p1 }).Compile()); }