拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 创建包含自变量的通用lambda表达式

创建包含自变量的通用lambda表达式

白鹭 - 2022-01-23 2127 0 0

简而言之,我正在尝试构建相当于

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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *