我有一个声明的类:
public abstract class CrmAttribute <T> : ICrmAttribute
{
}
在其中一种方法中,我有这个
castedValue = (T)value;
然后将 castedValue
用于T
类型的其他方法作为参数。
我的问题是出现了一个案例,上面的演员抛出InvalidCastException
。
据我所知,这是一个具体案例;在Dynamics 2011中,Microsoft最终放弃了自定义类型,如CRMNumber
,并转移到固有的.Net类型,但并非适用于所有情况。剩下的是一个复杂的Money
类型,它有一个.Value
属性,包含一个小数。这是抛出我的异常的地方,因为我无法将小数转换为Money类型。即使Money
对象基本上是Decimal
。
我对generics还是比较新的,其中很多都是继承的代码,所以我很清楚正确的响应本身并不是这样做的,但我想做的就是能够创建Money
到Decimal
类型的隐式强制转换,以便使用T
的行正确投射。
这可能吗?
答案 0 :(得分:2)
您最好的选择是在演员周围为您的班级添加代码,以测试T是否是有问题的类型并执行适当的转换而不是依赖演员。
也许是这样的:
if (typeof(Money).IsAssignableFrom(typeof(T))
{
// special handling required to convert decimal to money
castedValue = new Money() { Value = value }; // ? best guess
}
else
{
castedValue =(T)value;
}
答案 1 :(得分:0)
由于存在多种不同的货币,因此您不能将小数类型转换为货币类型。
您不能将隐式强制转换添加到其他类型,除非它在类型本身中声明。你必须做一些明确的演员。
答案 2 :(得分:0)
你能不能做到以下几点:
public partial class Money
{
public static implicit operator Money(decimal d)
{
// do whatever code in here you want to change your decimal into the money type
}
}
我并不是说这是一个好主意,但如果Money不是一种价值类型而且没有密封,那么这应该是可能的。