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

10

我在翻阅Sam's LINQ Unleashed for C#时,看到第7页上列出了以下内容:

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

我不太明白语言学家的评论是否是一个玩笑。不过,在C#中确实可以做到这样的事情。

var obj = new { 
    Name = "Joe", Weight = 200,
    GetAge = new Func<int>(() => { return 43; })
};

有人能否提供一个现实生活中需要在匿名类型内定义函数的情况?还是这只是由于类型推断而没有实际应用的结果?


@GrantWinney - 我猜只读属性可以返回一个表达式。这与方法或事件不同。 - Hogan
语言学家的评论显然是为了幽默,但不一定是不真实的。正如你自己所展示的那样,可以创建带有方法的匿名对象,但是在需要使用它们的情况下,这种情况相当不可能发生。因此,作者说它们可能只对语言学家感兴趣。 - JLRishe
1个回答

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;
                }),
    };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接