C# 带表达式的Moq函数调用

C# 带表达式的Moq函数调用,c#,.net,asp.net-mvc,moq,C#,.net,Asp.net Mvc,Moq,我有以下用于DI和IOC Web服务客户端的接口 public interface IWcfServiceClientProvider <TContract>: IDisposable where TContract: class { TResult Execute<TResult>(Expression<Func<TContract, TResult>> expression); TResult Execute<T

我有以下用于DI和IOC Web服务客户端的接口

    public interface IWcfServiceClientProvider <TContract>: IDisposable where TContract: class
{

    TResult Execute<TResult>(Expression<Func<TContract, TResult>> expression);
    TResult Execute<TResult>(Expression<Func<TContract, TResult>> expression, bool closeConnection = true);

    void Execute(Expression<Action<TContract>> expression);
    void Execute(Expression<Action<TContract>> expression, bool closeConnection = true);


}

但是我想模拟对
GetList
的调用,而不是任何要执行的调用。如果可行,那么我可以过滤
Return
method

中的值,作为临时解决方案,我编写了一个简单的蛮力解决方案来比较以下表达式:

 List<BaseLookup> myList = new List<BaseLookup> { 
                        new BaseLookup { Id =1, Code = "1001"},
                        new BaseLookup { Id =2, Code = "1002"},
                        new BaseLookup { Id =3, Code = "1003"}};
    public static bool ExpressionMatcher<TIn, TResult>(Expression<Func<TIn, TResult>> expr1, Expression<Func<TIn, TResult>> expr2)
    {
        if (expr1 == null || expr2 == null)
        {
            return false;
        }

        if (expr1 == expr2)
        {
            return true;
        }

        if (expr1.Type != expr2.Type)
        {
            return false;
        }

        if (expr1.Body == expr2.Body)
        {
            return true;
        }

        if (expr1.Body.NodeType != expr2.Body.NodeType)
        {
            return false;
        }

        if (expr1.Body.NodeType == ExpressionType.Call)
        {
            dynamic expr1Body = expr1.Body;
            dynamic expr2Body = expr2.Body;

            if (expr1Body.Method.Name == expr2Body.Method.Name &&
                expr1Body.Method.ReturnType == expr2Body.Method.ReturnType)
            {
                if (expr1Body.Arguments == null && expr2Body.Arguments == null)
                {
                    return true;
                }

                if (expr1Body.Arguments.Count != expr2Body.Arguments.Count)
                {
                    return false;
                }

                return true;
            }
        }

        return false;

    }
公共静态bool ExpressionMatcher(表达式expr1、表达式expr2)
{
如果(expr1==null | | expr2==null)
{
返回false;
}
如果(expr1==expr2)
{
返回true;
}
if(expr1.Type!=expr2.Type)
{
返回false;
}
if(expr1.Body==expr2.Body)
{
返回true;
}
if(expr1.Body.NodeType!=expr2.Body.NodeType)
{
返回false;
}
if(expr1.Body.NodeType==ExpressionType.Call)
{
动态expr1Body=expr1.Body;
动态expr2Body=expr2.Body;
if(expr1Body.Method.Name==expr2Body.Method.Name&&
expr1Body.Method.ReturnType==expr2Body.Method.ReturnType)
{
if(expr1Body.Arguments==null&&expr2Body.Arguments==null)
{
返回true;
}
if(expr1Body.Arguments.Count!=expr2Body.Arguments.Count)
{
返回false;
}
返回true;
}
}
返回false;
}
我用下面的称呼它

Expression<Func<ILookupService, List<BaseLookup>>> expr = lookup => lookup.GetMyList(It.IsAny<long>());
.Setup(mock => mock.Execute(It.Is<Expression<Func<ILookupService, List<BaseLookup>>>>(method => ExpressionMatcher(method, expr))))
.Returns(myList)
.Verifiable();
Expression expr=lookup=>lookup.GetMyList(It.IsAny());
.Setup(mock=>mock.Execute(It.Is(method=>ExpressionMatcher(method,expr)))
.Returns(myList)
.可验证();

此时我不需要检查参数的类型。如果你有更好的答案,请告诉我

有人知道我遗漏了什么吗?ThanksI还试图嘲笑ILookupService。但执行时间与此不匹配。我当时试过这个解决办法,但还是不起作用。
    public static bool ExpressionMatcher<TIn, TResult>(Expression<Func<TIn, TResult>> expr1, Expression<Func<TIn, TResult>> expr2)
    {
        if (expr1 == null || expr2 == null)
        {
            return false;
        }

        if (expr1 == expr2)
        {
            return true;
        }

        if (expr1.Type != expr2.Type)
        {
            return false;
        }

        if (expr1.Body == expr2.Body)
        {
            return true;
        }

        if (expr1.Body.NodeType != expr2.Body.NodeType)
        {
            return false;
        }

        if (expr1.Body.NodeType == ExpressionType.Call)
        {
            dynamic expr1Body = expr1.Body;
            dynamic expr2Body = expr2.Body;

            if (expr1Body.Method.Name == expr2Body.Method.Name &&
                expr1Body.Method.ReturnType == expr2Body.Method.ReturnType)
            {
                if (expr1Body.Arguments == null && expr2Body.Arguments == null)
                {
                    return true;
                }

                if (expr1Body.Arguments.Count != expr2Body.Arguments.Count)
                {
                    return false;
                }

                return true;
            }
        }

        return false;

    }
Expression<Func<ILookupService, List<BaseLookup>>> expr = lookup => lookup.GetMyList(It.IsAny<long>());
.Setup(mock => mock.Execute(It.Is<Expression<Func<ILookupService, List<BaseLookup>>>>(method => ExpressionMatcher(method, expr))))
.Returns(myList)
.Verifiable();