使用该lambda中包含的匿名类型定义lambda表达式

时间:2010-08-10 07:17:25

标签: c# lambda anonymous-types

我正在尝试避免使用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本身之前,我看不到一个有用的方法来处理它。

是否有一种优雅的方式来获取这个匿名类的类型?

1 个答案:

答案 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表达式,除非你有任何特殊的理由不这样做。

相关问题