C# 表达式来选择方法

C# 表达式来选择方法,c#,lambda,moq,C#,Lambda,Moq,我正在尝试根据使用反射动态配置Moq 在他们使用的示例中 var body = Expression.PropertyOrField( parameter, "ExampleProperty" ); 创建表达式以选择对象上所需的特性,然后使用该选择器构造lambda表达式 我希望我的选择器选择一个方法,例如,我希望动态构造以下内容: mock.Setup(m => m.MyMethod()).Returns(1); 我试过使用: var body = Expression.Prope

我正在尝试根据使用反射动态配置Moq

在他们使用的示例中

var body = Expression.PropertyOrField( parameter, "ExampleProperty" );
创建表达式以选择对象上所需的特性,然后使用该选择器构造lambda表达式

我希望我的选择器选择一个方法,例如,我希望动态构造以下内容:

mock.Setup(m => m.MyMethod()).Returns(1); 
我试过使用:

var body = Expression.PropertyOrField(parameter, "MyMethod");

但这两种方法似乎都只适用于属性或字段,是否有其他选择器可用于选择方法

完整代码如下:

var mock = new Mock<T>();
var parameter = Expression.Parameter(typeof(T));

if (typeof(T).GetMethod("MyMethod") != null)
{
    var body = Expression.PropertyOrField(parameter, "MyMethod");
    var lambdaExpression = Expression.Lambda<Func<T, int>>(body, parameter);
    mock.Setup(lambdaExpression).Returns(0);
}
var mock=new mock();
var参数=表达式参数(typeof(T));
if(typeof(T).GetMethod(“MyMethod”)!=null)
{
var body=Expression.PropertyOrField(参数“MyMethod”);
var lambdaExpression=Expression.Lambda(主体,参数);
Setup(lambdaExpression).Returns(0);
}

虽然我在这里无法访问
Moq
,但我可以向您展示如何构建调用方法的lambda表达式

private void DoIt<T>()
{
    var mock = new Mock<T>();
    var parameter = Expression.Parameter(typeof(T));
    var methodInfo = typeof(T).GetMethod("MyMethod"); //Find the method "MyMethod" on type "T"
    if (methodInfo != null)
    {
        var body = Expression.Call(parameter, methodInfo);
        var lambdaExpression = Expression.Lambda<Func<T, int>>(body, parameter);
        //At this point, lambdaExpression is:
        //Param_0 => Param_0.MyMethod()
        mock.Setup(lambdaExpression).Returns(0);
    }
}

class MyClass 
{
    public int MyMethod() 
    {
        return 5;
    }
}
private void DoIt()
{
var mock=new mock();
var参数=表达式参数(typeof(T));
var methodInfo=typeof(T).GetMethod(“MyMethod”);//在类型“T”上查找方法“MyMethod”
如果(methodInfo!=null)
{
var body=Expression.Call(参数,methodInfo);
var lambdaExpression=Expression.Lambda(主体,参数);
//此时,lambdaExpression是:
//Param_0=>Param_0.MyMethod()
Setup(lambdaExpression).Returns(0);
}
}
类MyClass
{
公共int-MyMethod()
{
返回5;
}
}
请注意,
typeof(T).GetMethod(“MyMethod”)
不是很具体。您可以使用大量重载(或利用
GetMethods
和filter)来按名称、返回类型和参数类型指定方法


另外,请注意
表达式.Lambda
仅适用于没有返回
int
的参数的方法。根据确定方法的负责人,您可能也希望此方法可配置。

期待这篇文章的答案,它看起来真的很有趣!但是,对于这个问题,我很抱歉:/
private void DoIt<T>()
{
    var mock = new Mock<T>();
    var parameter = Expression.Parameter(typeof(T));
    var methodInfo = typeof(T).GetMethod("MyMethod"); //Find the method "MyMethod" on type "T"
    if (methodInfo != null)
    {
        var body = Expression.Call(parameter, methodInfo);
        var lambdaExpression = Expression.Lambda<Func<T, int>>(body, parameter);
        //At this point, lambdaExpression is:
        //Param_0 => Param_0.MyMethod()
        mock.Setup(lambdaExpression).Returns(0);
    }
}

class MyClass 
{
    public int MyMethod() 
    {
        return 5;
    }
}