我可以创建自定义隐式类型转换吗?

时间:2011-12-12 18:06:01

标签: c# generics casting dynamics-crm dynamics-crm-2011

我有一个声明的类:

public abstract class CrmAttribute <T> : ICrmAttribute
{

}

在其中一种方法中,我有这个

castedValue = (T)value;
然后将

castedValue用于T类型的其他方法作为参数。

我的问题是出现了一个案例,上面的演员抛出InvalidCastException

据我所知,这是一个具体案例;在Dynamics 2011中,Microsoft最终放弃了自定义类型,如CRMNumber,并转移到固有的.Net类型,但并非适用于所有情况。剩下的是一个复杂的Money类型,它有一个.Value属性,包含一个小数。这是抛出我的异常的地方,因为我无法将小数转换为Money类型。即使Money对象基本上是Decimal

我对generics还是比较新的,其中很多都是继承的代码,所以我很清楚正确的响应本身并不是这样做的,但我想做的就是能够创建MoneyDecimal类型的隐式强制转换,以便使用T的行正确投射。

这可能吗?

3 个答案:

答案 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不是一种价值类型而且没有密封,那么这应该是可能的。