C#方法在匿名类型中初始化

时间:2014-12-12 18:50:55

标签: c# linq lambda anonymous-types

我正在浏览Sam的LINQ Unleashed for C#,并在第7页列出:

  

匿名类型可以初始化为包含方法,但这些可能只是语言学家感兴趣。

我真的不明白语言学家的评论是否是一个笑话。无论如何,可以在C#

中做这样的事情
var obj = new { 
    Name = "Joe", Weight = 200,
    GetAge = new Func<int>(() => { return 43; })
};

有没有人有真实生活情况需要在匿名类型中定义一个函数?或者这只是类型推理的结果而没有实际应用?

1 个答案:

答案 0 :(得分:2)

我会说它更像是Func<T>类型的属性而不是方法。在标准类型声明中,它将具有以下形式:

private Func<decimal> myFunc;

public Func<decimal> MyFunc
{
    get
    {
        return myFunc;
    }
}

并且用法将是您需要动态调整结果到当前值的任何函数。只有匿名类型才能暂时对数据进行分组,而实际上并不需要实现新类型。

例如,假设我正在循环访问某些servicePayments集合,并且我希望获得一些付款以及客户付款总额的值。要计算TotalPayedByCustomer,我可以使用Func。我无法在任何其他类型的财产中做到这一点。下面是这个假设类型的一些代码。

var payment =
    new
    {
        Gross = gross,
        Tax = taxAmount,
        Commission = commAmount,
        TotalPayedByCustomer = new Func<decimal>(
            () =>
                {
                    var totalPayed = 0m;
                    foreach (var custPay in customerPayments)
                    {
                        if (custPay.Payed)
                        {
                            totalPayed += custPay.Amount;
                        }
                    }

                    return totalPayed;
                }),
    };