在课堂上,我们正在处理泛型,并被要求完成作业。
我们创建了一个Account<T>
类,其中包含一个属性private T _balance;
,然后必须编写方法来记入和借记_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
方法更改为:(从主要方式调用,例如acc1.Credit(4.6);
)
public void Credit(dynamic credit)
{
_balance += ConvertType(credit);
}
public T ConvertType(object input)
{
return (T)Convert.ChangeType(input, typeof(T));
}
这是我不明白的。 credit方法将对象作为dynamic
类型,ConvertType(object input)
将其作为类型T
返回。
为什么使用动态类型允许我在泛型上使用运算符?
答案 0 :(得分:6)
使用dynamic
类型时,解析将延迟到运行时。如果在运行时,泛型类型支持+
运算符,则代码将起作用。如果没有,它将抛出异常。
来自dynamic
上的MSDN文章:
在编译时,假定输入为动态的元素 支持任何操作。