My programme will get service name and method name during its run time, and to execute the method dynamically I m creating a lambda expression based func.
public static Func<object,object,object> CreateLambdaExpression2(string tService, string methodName)
{
var inputServiceType = Type.GetType(tService);
var methodInfo = inputServiceType.GetMethod(methodName);
var inputType = methodInfo.GetParameters().First().ParameterType;
var outputType = methodInfo.ReturnParameter.ParameterType;
var instance = Expression.Parameter(inputServiceType, "serviceInstance");
var input = Expression.Parameter(inputType, "inputData");
var call = Expression.Call(instance, methodInfo, input);
var lambdaFunc = Expression.Lambda<Func<object,object, object>>(call, instance, input).Compile(); //<= this line throws the error.
return lambdaFunc;
}
but it won't and it will throw error at run time
var compiledMethod = ServiceMapper.CreateLambdaExpression2(tService,"Get");
var serviceInstance = new TestDemoService();
var inputData = new TestDemoPersonRequest()
{
Id = 555
};
var result = compiledMethod(serviceInstance, inputData);
System.ArgumentException: 'ParameterExpression of type 'UnitTests.ITestDemoService' cannot be used for delegate parameter of type 'System.Object''
Is there a way to specify the type for the Expression.Lambda?
Expression.Lambda<Func<object,object, object>>
to
Expression.Lambda<Func<inputServiceType ,inputType , outputType >>
Aucun commentaire:
Enregistrer un commentaire