簡而言之,我正在嘗試構建相當于
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 });
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/396649.html
