在类中,我们正在处理仿制药,并被要求完成作业。
我们使用一个属性private T _balance;
创建了一个Account<T>
类,然后不得不编写信用和借记_balance
的方法。
Credit method
(部分)从main调用,例如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;
}
我不得不调节检查和铸造,因为我无法_balance += (T)balanceObject;
,因为这将给出错误"Operator '+' cannot be applied to operand of type 'T'"
在阅读有关该主题的过程中,我发现了dynamic
类型。在我的新帐户类中,我添加了一种新方法,并将Credit
方法更改为:(从main命名为e.g acc1.Credit(4.6);
)
public void Credit(dynamic credit)
{
_balance += ConvertType(credit);
}
public T ConvertType(object input)
{
return (T)Convert.ChangeType(input, typeof(T));
}
这就是我不明白的。信用方法以dynamic
的类型和ConvertType(object input)
的形式将其归为 T
。为什么使用动态类型允许我使用仿制药?
使用dynamic
类型时,将分辨率推迟到运行时。如果在运行时,通用类型支持+
操作员,则您的代码将起作用。如果没有,它将抛出异常。
来自dynamic
上的MSDN文章:
在编译时,假定为动态键入的元素 支持任何操作。