Вот еще одно решение с использованием деревьев выражений Linq, которое я нашел за это время:
private delegate void AddTouchLocationDelegate(
ref TouchCollection touchCollection,
int id,
TouchLocationState state,
float x,
float y,
TouchLocationState prevState,
float prevX,
float prevY
);
private static AddTouchLocationDelegate createAddTouchLocationDelegate() {
MethodInfo addTouchLocationMethod = typeof(TouchCollection).GetMethod(
"AddTouchLocation", BindingFlags.Instance | BindingFlags.NonPublic
);
Type byrefTouchCollection = typeof(TouchCollection).MakeByRefType();
ParameterExpression instance = Expression.Parameter(byrefTouchCollection, "instance");
ParameterExpression idValue = Expression.Parameter(typeof(int), "id");
ParameterExpression stateValue = Expression.Parameter(
typeof(TouchLocationState), "state"
);
ParameterExpression xValue = Expression.Parameter(typeof(float), "x");
ParameterExpression yValue = Expression.Parameter(typeof(float), "y");
ParameterExpression prevStateValue = Expression.Parameter(
typeof(TouchLocationState), "prevState"
);
ParameterExpression prevXValue = Expression.Parameter(typeof(float), "prevX");
ParameterExpression prevYValue = Expression.Parameter(typeof(float), "prevY");
Expression<AddTouchLocationDelegate> expression =
Expression.Lambda<AddTouchLocationDelegate>(
Expression.Call(
instance, addTouchLocationMethod,
idValue, stateValue, xValue, yValue, prevStateValue, prevXValue, prevYValue
),
instance,
idValue, stateValue, xValue, yValue, prevStateValue, prevXValue, prevYValue
);
return expression.Compile();
}
Использование простое:
var d = createAddTouchLocationDelegate();
d(
ref this.touches,
1, TouchLocationState.Pressed, 10, 10, TouchLocationState.Released, 0, 0
);