То, что я пытаюсь достичь здесь, - это сравнение прямых значений примитивных типов в штучной упаковке.
((object)12).Equals((object)12); // Type match will result in a value comparison,
((object)12).Equals((object)12d); // but a type mismatch will not. (false)
object.Equals((object)12,(object)12d); // Same here. (false)
Я понимаю "почему". Я просто не вижу "как".
Типы неизвестны до времени исполнения, где они могут быть любыми примитивными типами из источника данных. Это включает в себя строки, datetimes, bools и т.д. Я пошел по уродливому пути написания метода расширения, который работает с обоими типами, а затем отбрасывает перед выполнением сравнения "==": (Для полноты я включил каждый примитивный тип, плюс те, которые меня интересовали)
public static bool ValueEquals(this object thisObj, object compare)
{
if (thisObj is int)
{
int obj = (int)thisObj;
if (compare is int)
return (obj == (int)compare);
if (compare is uint)
return (obj == (uint)compare);
if (compare is decimal)
return (obj == (decimal)compare);
if (compare is float)
return (obj == (float)compare);
<... and so on for each primitive type ...>
}
if (thisObj is uint)
{
uint obj = (uint)thisObj;
if (compare is int)
return (obj == (int)compare);
if (compare is uint)
return (obj == (uint)compare);
<... Again for each primitive type ...>
}
if (thisObj is decimal)
{
decimal obj = (decimal)thisObj;
if (compare is int)
return (obj == (int)compare);
<... Etc, etc ...>
Результирующий метод оказался длиннее на 300 + строк, что было прекрасно (но отвратительно), но теперь мне нужно сделать больше, чем просто "==". Мне нужно > , <, < =, > =,! =.
Есть ли что-нибудь в Reflection, которое я мог бы использовать для сопоставлений типов в штучной упаковке?
Что-нибудь вообще?