2012-10-19 7 views
6

In classe abbiamo a che fare con i generici e ci è stato chiesto di completare un incarico.In C#, perché l'utilizzo del tipo dinamico mi consente di utilizzare operatori su generici?

Abbiamo creato una classe Account<T> con una proprietà private T _balance; e quindi abbiamo dovuto scrivere metodi per accreditare e addebitare _balance.

Credit method (parziale) chiamato da Principale per es. acc1.Credit(4.6);:

public void Credit(T credit) 
    { 
     Object creditObject = credit; 
     Object balanceObject = _balance; 

     Type creditType = creditObject.GetType(); 
     Type balanceType = balanceObject.GetType(); 

     if(creditType.Equals(balanceType)) 
     { 
      if(creditType.Equals(typeof (double))) 
      { 
       balanceObject= (double)balanceObject + (double)creditObject; 
      } 
     ...WITH more else if's on int,float and decimal. 
     } 
     _balance = (T)balanceObject; 
    } 

ho dovuto condizione di controllo e cast come non posso _balance += (T)balanceObject; come questo vi darà l'errore "Operator '+' cannot be applied to operand of type 'T'"

Durante la mia lettura sull'argomento ho scoperto il tipo dynamic. Nella mia nuova classe Account Ho aggiunto un nuovo metodo e cambiato il metodo Credit a: (chiamato da Main da esempio acc1.Credit(4.6);)

public void Credit(dynamic credit) 
    { 
     _balance += ConvertType(credit); 
    } 
    public T ConvertType(object input) 
    { 
     return (T)Convert.ChangeType(input, typeof(T)); 
    } 

Questo è quello che non capisco. Il metodo di accredito prende l'oggetto come tipo dynamic e lo ConvertType(object input) lo restituisce come tipo T. Perché l'utilizzo del tipo dinamico mi consente di utilizzare operatori su generici?

+0

Hai già eseguito? La parola chiave 'dynamic' ritarderà (differire) il tipo di controllo che il compilatore normalmente esegue finché non si esegue effettivamente il programma. –

+0

Cheers. Il programma funziona bene. Inoltre, aggiungendo alla mia confusione c'era il metodo "ConvertType" che mi permetteva di inserire stringhe numeriche ai miei generici, ad es. 'Acc1.Credit ("100");'. Quindi stavo iniziando ad avere alcune strane idee su 'generici'. Non appena ho letto "differisci", Eureka! –

risposta

6

Quando si utilizzano i tipi dynamic, la risoluzione viene differita fino al runtime. Se, durante il runtime, il tipo generico supporta un operatore +, il codice funzionerà. In caso contrario, genererà un'eccezione.

Da un articolo MSDN su dynamic:

In fase di compilazione, un elemento che viene digitato dinamico si presume supporto qualsiasi operazione.

+0

Grazie mille. Ha senso ora. :) –

Problemi correlati