C# 我可以动态地创建一个表示lambda的表达式来调用输入参数上的方法吗?
假设我有一个a类的对象。 假设我需要一个在类A上调用方法M的表达式。 这是否可行 基本上,我需要通过编程得到这个lambda a=>a.M() 诀窍是,我想一般地这样做,也就是说,我计划使用反射来确定这个方法被称为M,以及它需要什么参数 我尝试使用Expression.Lambda(MethodCallExpression方法,ParameterExpression参数) 问题是,当我定义方法调用表达式时,我必须指定一个实例(如果它是静态方法,则将其保留为null,而不是)。我不要这个。我希望传递到lambda中的任何参数(在我的示例中是a)都是实例C# 我可以动态地创建一个表示lambda的表达式来调用输入参数上的方法吗?,c#,C#,假设我有一个a类的对象。 假设我需要一个在类A上调用方法M的表达式。 这是否可行 基本上,我需要通过编程得到这个lambda a=>a.M() 诀窍是,我想一般地这样做,也就是说,我计划使用反射来确定这个方法被称为M,以及它需要什么参数 我尝试使用Expression.Lambda(MethodCallExpression方法,ParameterExpression参数) 问题是,当我定义方法调用表达式时,我必须指定一个实例(如果它是静态方法,则将其保留为null,而不是)。我不要这个。我希望传
这可能吗?是的,可以在运行时构造
linq表达式
例如,下面是构造方法调用表达式的示例,该方法调用返回对象
。这实际上是一个伪示例,因为最好避免使用对象
,而使用严格类型
static Expression<Func<T, object>> ComposeMethodCallExpressionAsFuncObject<T>(string methodName)
{
MethodInfo mi = typeof(T).GetMethod(methodName, types: new Type[0])
?? throw new ArgumentException($"There is no '{methodName}' method in the '{typeof(T).Name}' with the empty arguments list!");
var paramExpression = Expression.Parameter(typeof(T));
var methodCallExpression = Expression.Call(paramExpression, mi);
var result = Expression.Lambda<Func<T, object>>(methodCallExpression, paramExpression);
return result; // (T obj) =>obj.methodName()
}
静态表达式composeMethodCallExpressionAsfUnObject(字符串方法名)
{
MethodInfo mi=typeof(T).GetMethod(方法名,类型:新类型[0])
?抛出新ArgumentException($“在参数列表为空的“{typeof(T).Name}”中没有“{methodName}”方法!”);
var parametexpression=Expression.Parameter(typeof(T));
var methodCallExpression=Expression.Call(paramExpression,mi);
var result=Expression.Lambda(methodCallExpression,paramExpression);
返回结果;/(T obj)=>obj.methodName()
}
,以及使用示例:
int foo = 9988;
var expression = ComposeMethodCallExpressionAsFuncObject<int>(nameof(int.ToString));
//expression: (int obj) => obj.ToString()
var result = expression.Compile()(foo);
Assert.AreEqual("9988", result);
intfoo=9988;
var expression=composeMethodCallExpressionAsfUnObject(name of(int.ToString));
//表达式:(int obj)=>obj.ToString()
var result=expression.Compile()(foo);
断言.AreEqual(“9988”,结果);