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

mas*_*rur 10 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; })
};
Run Code Online (Sandbox Code Playgroud)

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

Pio*_*ski 2

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

private Func<decimal> myFunc;

public Func<decimal> MyFunc
{
    get
    {
        return myFunc;
    }
}
Run Code Online (Sandbox Code Playgroud)

其用法与您需要将结果动态调整为当前值的任何函数一样。仅使用匿名类型,您只需临时对数据进行分组,并不真正需要实现新类型来做到这一点。

例如,假设我正在循环处理一些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;
                }),
    };
Run Code Online (Sandbox Code Playgroud)