Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何转换谓词<;T>;对一个表达式<;谓词<;T>&燃气轮机;与最小起订量一起使用?_C#_Linq_Lambda_Moq - Fatal编程技术网

C# 如何转换谓词<;T>;对一个表达式<;谓词<;T>&燃气轮机;与最小起订量一起使用?

C# 如何转换谓词<;T>;对一个表达式<;谓词<;T>&燃气轮机;与最小起订量一起使用?,c#,linq,lambda,moq,C#,Linq,Lambda,Moq,请帮助这个Linq新手 我正在测试的类中创建一个列表,我想使用Moq来检查结果 我可以很容易地组合一个检查列表结果的谓词。然后如何将该谓词转换为表达式 var myList = new List<int> {1, 2, 3}; Predicate<List<int>> myPredicate = (list) => { return list.Count == 3; //

请帮助这个Linq新手

我正在测试的类中创建一个列表,我想使用Moq来检查结果

我可以很容易地组合一个检查列表结果的谓词。然后如何将该谓词转换为表达式

var myList = new List<int> {1, 2, 3};

Predicate<List<int>> myPredicate = (list) => 
                  {
                      return list.Count == 3; // amongst other stuff
                  };

// ... do my stuff

myMock.Verify(m => m.DidStuffWith(It.Is<List<int>>( ??? )));
var myList=新列表{1,2,3};
谓词myPredicate=(列表)=>
{
return list.Count==3;//以及其他内容
};
// ... 做我的事
myMock.Verify(m=>m.didtuffwith(It.Is(?));
???如果你能理解那么多泛型,就需要是一个
表达式。我找到了相反的答案,并将表达式编译成谓词。不过,他们并没有帮助我更好地理解林克

编辑:我已经让它与方法一起工作;有表情;我只想知道,是否有任何方法可以使用带有主体的lambda来实现这一点,如果没有,为什么不呢?

更改:

Predicate<List<int>> myPredicate = (list) => list.Count == 3;
谓词myPredicate=(list)=>list.Count==3;
致:

表达式myPredicate=(list)=>list.Count==3;
编译器为您发挥了神奇的作用。使用一些注释1,任何只处理表达式(无块)的lambda都可以通过使用
表达式
包装委托类型(在本例中为
谓词
)转换为表达式树。正如您所指出的,您可以通过调用
myPredicate.Compile()
再次反转它

1例如,异步lambda(即
async()=>wait Task.Delay(1);
)不能转换为表达式树


更新:如果表达式树中包含语句,则无法使用编译器获取所需的表达式树。您必须使用
expression
中的静态方法自己构建表达式树(需要做更多的工作)。(<代码>表达式,块,<代码>表达式。IfThen < /代码>等)< /P> < P> Kirk Woll的答案直接解决您的问题,但请考虑以下事实:在<代码>安装> <代码> > <代码>空白> <代码>方法中,处理在调用中传递的参数。这对我来说更有意义,因为您已经必须构建一个方法来验证列表;它还提供列表的本地副本

//what is this list used for?
var myList = new List<int> {1, 2, 3};

List<int> listWithWhichStuffWasDone = null;
//other setup

myMock.Setup(m => m.DoStuffWith(It.IsAny<List<int>>()).
    Callback<List<int>>(l => listWithWhichStufFWasDone = l);

objectUnderTest.MethodUnderTest();

myMock.Verify(m => m.DoStuffWith(It.IsAny<List<int>>()));
Validate(listWithWhichStuffWasDone);
//此列表用于什么?
var myList=新列表{1,2,3};
列表列表,其中tuffwasdone=null;
//其他设置
myMock.Setup(m=>m.dostufwith(It.IsAny())。
回调(l=>listWithWhichStufFWasDone=l);
objectUnderTest.MethodUnderTest();
验证(m=>m.dostufwith(It.IsAny());
验证(完成任务的列表);

这适用于表达式,但不适用于带有表达式主体的lambda。已更新,以将其包含在我的示例中。不过,感谢您教我这一点;没有括号我从未尝试过。@Kirk Woll:“任何lambda都可以转换为表达式树。”这是错误的。考虑有一个表达式体的lambda。任何人都能解释它是什么性质的表达式树来阻止这个?或者仅仅是它们编译成一些可怕的(或漂亮的)功能和函数不能包含状态?@ Luunvor,请看Eric Lippert的答案:“这是一个明显的、有用的特性,我们根本没有时间来研究C 4。我们将为假设的未来版本考虑它。如果您有一个非常好的用户语句树的场景,我很乐意听。“@Kirk Woll,谢谢。我刚刚更新了Eric的答案,因为这显然是一个非常棒的用户场景。这样做与使用
myMock.DidStuffWith(…)有什么功能上的区别
返回它被要求处理的列表,该列表可以在本地检查?@arootbeer更改内容并返回值的方法最终用于返回值,更改内容会产生可怕的副作用。查看次数太多。可以更改状态,也可以返回值,但不能同时更改状态和返回值(除了fluent接口的情况,它是专门为返回接口设计的)。功能上没有区别。实际上有。所以
myMock.didtuffwith(…)
是一个无效的方法吗?如果是的话,那么我完全同意你的看法。@arootbeer是的,它是(实际上是存储库上的一个保存)好的。我会用一个更方便的方法来回答一个问题:我正在尝试设置一个方法。当然,我正在使用验证。我不喜欢整个给定的、预期的、什么时候、然后返回和重读所有的东西,因为你期望的结果在中间发生了一些奇怪的事情,所以安装程序不会削减它。我喜欢。测试结束时的结果。这样更可读。(顺便说一句,我使用了一种方法,解决了问题。得到了Eric的感谢。也谢谢你!)有趣的是,我是从Rhino Mocks(晚2.x或早3.x IIRC)来Moq的我注意到你不必对最小起订量做这样的设置,但我从来没有想过要放弃安排部分,在最后声明。
//what is this list used for?
var myList = new List<int> {1, 2, 3};

List<int> listWithWhichStuffWasDone = null;
//other setup

myMock.Setup(m => m.DoStuffWith(It.IsAny<List<int>>()).
    Callback<List<int>>(l => listWithWhichStufFWasDone = l);

objectUnderTest.MethodUnderTest();

myMock.Verify(m => m.DoStuffWith(It.IsAny<List<int>>()));
Validate(listWithWhichStuffWasDone);