通过匿名类型的帮助缩短此LINQ查询?

vex*_*exe 8 .net c# linq anonymous-types where

我正在查询MethodInfo[]我正在尝试查找返回类型为的所有方法void,并且只有一个特定类型的参数.我想以最简约和最短的方式做到这一点.

一种方法是:

var validMethods = methods.Where(m => m.ReturnType == typeof(void) && m.GetParameters().Length == 1 && m.GetParameters()[0].ParameterType == wantedType);
Run Code Online (Sandbox Code Playgroud)

要么

var validMethods = methods
      .Where(m => m.ReturnType == typeof(void))
      .Where(m.GetParameters().Length == 1 && m.GetParameters()[0].ParameterType == wantedType);
Run Code Online (Sandbox Code Playgroud)

但是有一个多余的GetParameters电话 - 一个电话就足够了.所以我认为我可以将其缓存为匿名类型,如下所示:

var validMethods = methods
    .Where(m => m.ReturnType == typeof(void))
    .Select(m => new { Params = m.GetParameters() })
    .Where(p => p.Length == 1 && p[0].ParameterType == transition.eventType);
Run Code Online (Sandbox Code Playgroud)

但它没有工作,我得到了错误说没有Length,也不是一个索引的匿名类型p是类型ParameterInfo[]

这是编写此查询的最短方式吗?如果是这样,我怎么能让匿名类型工作?如果没有,最简单的方法是什么?(获取void返回的所有方法,以及该param属于某种类型的一个param)

谢谢你的帮助 :)

Ser*_*kiy 11

使用查询语法,您可以引入新的范围变量,该变量将保存方法参数

from m methods.Where(m => m.ReturnType == typeof(void))
let p = m.GetParameters()
where p.Length == 1 && p[0].ParameterType == wantedType
select m
Run Code Online (Sandbox Code Playgroud)

方法语法不是很漂亮:

methods.Where(m => m.ReturnType == typeof(void))
       .Select(m => new { m, p = m.GetParameters() })
       .Where(x => x.p.Length == 1 && x.p[0].ParameterType == wantedType)
       .Select(x => x.m);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢:) - 顺便说一句,我纠正了我的Q中的长度,它应该是1而不是0. (2认同)