简而言之,我正在尝试构建相当于
Call<UnknownRegisteredClass>(r => r.UnknownMethod(...args))
作为Expression<Action<T>
运行时的通孔反射。
表达式的整个概念对我来说很新,但是我在档案中找到的所有内容似乎都没有从通用/反射的角度来解决它,而只是从更多的具有已知型别的构建表达式来解决它。
到目前为止,我已经设法装配了内部表达式r.UnknownMethod(...args)
:
Expression.Lambda<Action>(Expression.Call(Expression.New(actionType), actionMethod, parameterExpressions))
但我不确定如何将它包装在另一个级别,其中呼叫实际上是针对 an 的自变量进行的 Action<T>
似乎它会是这样的:
ParameterExpression instance = Expression.Parameter(typeof(T), "instance");
return Expression.Lambda<Action<T>>(Expression.Call(instance, HowDoIGetMyAboveExpressionHere), new ParameterExpression[] { instance });
但这并没有真正起作用,因为我无法使用,<T>
因为直到运行时我才知道型别。如果有人能看到我正在尝试做的事情并有任何例子,他们可以指出我,我会非常感激。
uj5u.com热心网友回复:
我显然非常接近我在问题结束时的情况。我创建了一个本地通用方法,它将为我回传表达式,然后我只是在运行时呼叫它:
public Expression<Action<T>> GetActionExpression<T>(Type type, MethodInfo callingMethod, List<Expression> parameterExpressions)
{
var callLambdaParameter = Expression.Parameter(type, "p");
var callBody = Expression.Call(callLambdaParameter, callingMethod, parameterExpressions.ToArray());
return Expression.Lambda<Action<T>>(callBody, callLambdaParameter);
}
然后呼叫它:
var genericActionExpression = GetType().GetMethod(nameof(GetActionExpression)).MakeGenericMethod(actionType).Invoke(this, new object[] { actionType, actionMethod, parameterExpressions});
然后我可以使用现在基本上r => r.UnknownMethod(...args)
呼叫所需的方法:
callMethod.Invoke(this, new[] { Caller, genericActionExpression });
0 评论