我正在尝试避免使用lambda表达式中的动态类型来分组集合。该类型是在编译时匿名定义的(据我所知,这是明确无误的)。我宁愿不把类型定义为一个完整的类,因为我在这个方法中只使用了几次。
示例代码:
Func<MyData, dynamic> dataGrouping = md => new
{
md.Property1,
md.Property2,
md.Property3
};
var groupedData = myDataCollection.GroupBy(dataGrouping);
虽然这会编译,但由于类型是动态的,因此我在组内部没有智能感知或强类型。
我无法将dataGrouping的类型指定为var,因为我在C#中而且我得到的抱怨无法将lambda表达式分配给隐式类型的局部变量。
我可以用匿名类型的GetType()替换动态吗?然后我需要在lambda中使用它之前的类型,但在我已经进入lambda本身之前,我看不到一个有用的方法来处理它。
是否有一种优雅的方式来获取这个匿名类的类型?
答案 0 :(得分:4)
您是否有任何理由不想将lambda表达式直接放在GroupBy
调用中?这就是它通常挂在一起的方式:
var groupedData = myDataCollection.GroupBy(md => new
{
md.Property1,
md.Property2,
md.Property3
});
你可以使用额外的方法来完成这项工作:
static Func<TSource, TResult> CreateFunction<TSource, TResult>
(Func<TSource, TResult> function)
{
return function;
}
然后使用类型推断:
var dataGrouping = CreateFunction((MyData md) => new
{
md.Property1,
md.Property2,
md.Property3
});
请注意我是如何明确键入参数的,以便类型推断可以使用。这会奏效,但有点难看。我会直接在方法调用中嵌入lambda表达式,除非你有任何特殊的理由不这样做。