Могу ли я создать пользовательский тип приведения? - PullRequest
2 голосов
/ 12 декабря 2011

У меня есть класс, объявленный так:

public abstract class CrmAttribute <T> : ICrmAttribute
{

}

И в одном из следующих методов у меня есть этот

castedValue = (T)value;

castedValue, который затем используется в других методахвведите T в качестве параметра.

Моя проблема заключается в том, что дело возникло так, что приведенный выше бросок выдает InvalidCastException.

Из того, что я могу сказать, это один конкретный случай;В Dynamics 2011 Microsoft окончательно отошла от пользовательских типов, таких как CRMNumber, и перешла к внутренним типам .Net, но не для всех случаев.Из тех, что остаются, это сложный тип Money, который имеет одно свойство .Value, которое содержит десятичную дробь.Именно здесь выдается мое исключение, так как я не могу привести десятичную к типу Money.Хотя объект Money по сути является Decimal.

Я все еще довольно новичок в дженериках, и большая часть этого является унаследованным кодом, поэтому я хорошо знаю ответ правильный это не делать это само по себе, но все, что я хочу сделать, - это иметь возможность создавать свое собственное неявное приведение типа Money к Decimal так, чтобы строка, использующая T, действовала правильно.

Возможно ли это?

Ответы [ 3 ]

2 голосов
/ 12 декабря 2011

Лучше всего добавить код в свой класс вокруг броска, чтобы проверить, является ли тип 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;
}
0 голосов
/ 12 декабря 2011

Не могли бы вы сделать следующее:

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
    }
}

Я не утверждаю, что это хорошая идея, но если Деньги не являются типом значения и не запечатаны, это должно быть возможно.

0 голосов
/ 12 декабря 2011

Желательно, чтобы вы не могли приводить десятичное число к типу денег из-за существования нескольких разных валют.

Нельзя добавить неявное приведение к другому типу, если оно не объявлено в типе.сам.Вам нужно будет выполнить явное приведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...