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

我试图避免在我的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本身之前,我看不到一个有用的方法来获取它。

有没有一种优雅的方式来获得这个匿名类的类型?


是否有任何理由不希望将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表达式,除非您有任何特殊原因不要。

链接地址: http://www.djcxy.com/p/90345.html

上一篇: Defining a lambda expression with an anonymous type contained within that lambda

下一篇: OrderBy descending in Lambda expression?