public static Call ( |
||
instance | An |
|
method | A |
|
arguments | IEnumerable |
An |
Résultat |
public static MethodCallExpression Call(Expression instance, MethodInfo method, IEnumerable<Expression> arguments)
{
IReadOnlyList<Expression> argumentList = arguments as IReadOnlyList<Expression>;
if (argumentList != null)
{
int argCount = argumentList.Count;
switch (argCount)
{
case 0:
return Call(instance, method);
case 1:
return Call(instance, method, argumentList[0]);
case 2:
return Call(instance, method, argumentList[0], argumentList[1]);
case 3:
return Call(instance, method, argumentList[0], argumentList[1], argumentList[2]);
}
if (instance == null)
{
switch (argCount)
{
case 4:
return Call(method, argumentList[0], argumentList[1], argumentList[2], argumentList[3]);
case 5:
return Call(method, argumentList[0], argumentList[1], argumentList[2], argumentList[3], argumentList[4]);
}
}
}
ContractUtils.RequiresNotNull(method, nameof(method));
ReadOnlyCollection<Expression> argList = arguments.ToReadOnly();
ValidateMethodInfo(method, nameof(method));
ValidateStaticOrInstanceMethod(instance, method);
ValidateArgumentTypes(method, ExpressionType.Call, ref argList, nameof(method));
if (instance == null)
{
return new MethodCallExpressionN(method, argList);
}
else
{
return new InstanceMethodCallExpressionN(method, instance, argList);
}
}
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 ( Type type, string methodName, Type typeArguments ) : |
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()); }