C# 我可以动态地创建一个表示lambda的表达式来调用输入参数上的方法吗?

C# 我可以动态地创建一个表示lambda的表达式来调用输入参数上的方法吗?,c#,C#,假设我有一个a类的对象。 假设我需要一个在类A上调用方法M的表达式。 这是否可行 基本上,我需要通过编程得到这个lambda a=>a.M() 诀窍是,我想一般地这样做,也就是说,我计划使用反射来确定这个方法被称为M,以及它需要什么参数 我尝试使用Expression.Lambda(MethodCallExpression方法,ParameterExpression参数) 问题是,当我定义方法调用表达式时,我必须指定一个实例(如果它是静态方法,则将其保留为null,而不是)。我不要这个。我希望传

假设我有一个a类的对象。 假设我需要一个在类A上调用方法M的表达式。 这是否可行

基本上,我需要通过编程得到这个lambda a=>a.M()

诀窍是,我想一般地这样做,也就是说,我计划使用反射来确定这个方法被称为M,以及它需要什么参数

我尝试使用Expression.Lambda(MethodCallExpression方法,ParameterExpression参数)

问题是,当我定义方法调用表达式时,我必须指定一个实例(如果它是静态方法,则将其保留为null,而不是)。我不要这个。我希望传递到lambda中的任何参数(在我的示例中是a)都是实例


这可能吗?

是的,可以在运行时构造
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”,结果);