C # Inicialização do método em tipos anônimos

10

Eu estava percorrendo o LINQ Unleashed de Sam para C # e na página 7 ele listou:

  

Tipos anônimos podem ser inicializados para incluir métodos, mas podem ser de interesse apenas para lingüistas.

Eu realmente não entendo se o comentário dos linguistas é uma piada. Independentemente disso, é possível fazer algo assim em C #

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

Alguém tem uma situação real em que seria necessário definir uma função dentro de um tipo anônimo? Ou isso é apenas um resultado do tipo de inferência sem aplicação prática?

    
por mashrur 12.12.2014 в 19:50
fonte

1 resposta

2

Eu diria que é mais uma propriedade do tipo Func<T> do que um método. Na declaração de tipo padrão, ele teria este formato:

private Func<decimal> myFunc;

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

E o uso seria de qualquer função em que você precisa ajustar seu resultado dinamicamente para os valores atuais. Apenas com o tipo anônimo você apenas agrupa os dados temporariamente e não precisa realmente implementar um novo tipo para fazer isso.

Como, por exemplo, suponho que estou dando um loop em algumas coleções de servicePayments e quero receber algum pagamento e um valor para o pagamento total por cliente. Aqui para calcular TotalPayedByCustomer , posso usar Func . Eu não poderia fazer isso em nenhum outro tipo de propriedade. Abaixo de algum código para este tipo hipotético.

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;
                }),
    };
    
por PiotrWolkowski 12.12.2014 / 21:45
fonte