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?
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. –
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! –