2014-12-12 19 views
9

stavo sfogliando di Sam LINQ Unleashed per C# e a pagina 7 è elencato:C# metodo di inizializzazione in tipi anonimi

tipi anonimi possono essere inizializzati per includere metodi, ma questi potrebbero essere solo di interesse per i linguisti.

Non capisco davvero se il commento dei linguisti sia uno scherzo. Indipendentemente da ciò, è possibile fare qualcosa di simile in C#

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

Qualcuno ha una situazione di vita reale in cui sarebbe stato necessario definire una funzione all'interno di un tipo anonimo? O questo è solo il risultato del tipo di inferenza senza applicazione pratica?

+0

Forse è una specie di brutto scherzo? Da [Tipi anonimi (Guida programmazione C#)] (http://msdn.microsoft.com/en-us/library/bb397696.aspx): _ "I tipi anonimi contengono una o più proprietà di sola lettura pubbliche. Nessun altro tipo di i membri della classe, come metodi o eventi, sono validi. "_ –

+0

@GrantWinney - Immagino che le proprietà di sola lettura possano restituire un'espressione. Questo è diverso da un metodo o evento. – Hogan

+0

Il commento dei linguisti è chiaramente inteso per essere umoristico, ma non necessariamente falso. Come tu stesso hai dimostrato, è possibile creare oggetti anonimi con metodi, ma per quanto riguarda una situazione in cui sarebbe "necessario" usarli, è piuttosto improbabile. Quindi perché l'autore ha detto che potrebbero interessare solo i linguisti. – JLRishe

risposta

2

Direi che è più di una proprietà di tipo Func<T> piuttosto che un metodo. In dichiarazione di tipo standard che avrebbe dovuto questa forma:

private Func<decimal> myFunc; 

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

E l'uso sarebbe come di ogni funzione in cui è necessario regolare il vostro risultato dinamicamente ai valori correnti. Solo con il tipo anonimo, raggruppa temporaneamente i dati e non è necessario implementare un nuovo tipo per farlo.

Ad esempio, supponiamo di eseguire il looping di alcune raccolte servicePayments e desidero ottenere un pagamento e un valore per il pagamento totale da parte del cliente. Qui per calcolare TotalPayedByCustomer posso usare Func. Non potrei farlo in nessun altro tipo di proprietà. Di seguito un codice per questo tipo ipotetico.

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