c# + explicit conversion + нубоквештн
Какого типа переменная theObj?
Показывай целиком код, тут не все телепаты.
Вообще это SourceGrid либа, в ней у объектов представляющих ячейки грида есть это самое поле Tag.
Это поле я юзал для мэппинга ячеек к неким сущностям. До этого момента сущности я мог охарактеризовать тупо интом. То есть я при построении грида делал примерно так:
...
var cell = new Cell(currentDataItem.Value);
cell.Tag = currentDataItem.Index; // это int
grid[row, col] = cell;
...
и потом где надо, доставал:
...
int itemIndex = (int) grid[rowCoord, colCoord].Tag;
...
зачем такой изврат - тут не рассматриваем (в SourceGrid немного через жопу делается отработка событий с гридом. в качестве EventArgs доступен только некий CellContext в котором есть Row и Column. Остальное я не стал копать)
сейчас я хочу делать, грубо говоря, так:
var cell = new Cell(currentDataItem.Value);
cell.Tag = currentDataItem;
grid[row, col] = cell;
и спрашиваю, существует ли способ сделать так, чтобы куски кода типа:
int itemIndex = (int) grid[rowCoord, colCoord].Tag;
при этом не поломались.
прописывания правила explicit conversion from MyDataHolderClass to int оказалось недостаточно (что в общем то по большому счету логично).
Вообще, приведение типа — кривовато же выглядит, нет?
Надо находить все эти места, где Tag используется этим образом и менять. Сам с шарпом давно не работал, но вот тут Shurik недавно заявлял, что его среда умеет находить подобные вещи, надо бы спросить у него.
Что мне надо сделать, чтобы все вынимания int'а не поломались ?не получится. Преобразование object -> int - это всегда dynamic_cast и custom-ные преобразования при этом не проверяются
Вообще, приведение типа — кривовато же выглядит, нет?Ну да, кривовато конечно. Надо было сразу для себя создавать какой нить TagData и договориться, что в Tag-ах юзать только его - но заломало, и решил что обойдусь интом. Не обошёлся ...
не получится. Преобразование object -> int - это всегда dynamic_cast и custom-ные преобразования при этом не проверяютсяНу печалько, чо
А нахрена тогда нужны все эти преобразования типа static explicit operator SomeType(SomeAnotherType obj){...} если не получается unbox-ить тот же object согласно этих правил ?
Так, чисто чтобы в коде можно было писать var myItem = (MyItem)itemOfAnotherType; вместо
var myItem = itemOfAnotherType.ConvertToMyItemType(); ?
какая то сомнительная выгода
А если у меня itemOfAnotherType объявлен как какой то суперкласс того, что на самом деле там сидит - у меня при таком explicit conversion чьи правила применятся ? суперкласса ? или реального класса ? или я в суперклассе должен это учесть для всего что ниже по иерархии ?
ps. В принципе я уже все места в коде подправил и забил (reSharper рулит, это да). Но осталось понимание, что я нихрена в этом не понимаю, и желание понимать хоть чуток поболее.
ps2. Всем спасибо.
а че мешает от cell отнаследоваться и расширить его до нужных вещей?
Когда архитектура будет до конца продумана, отрефакчу всё нахрен понормальному и опромышленю. А щас пока приходится лепить, просто чтоб работало.
Локальная автоматизация она такая локальная автоматизация ...
Оставить комментарий
Alena_08_11
в некое поле типа object пихался int и во многих местах кода доставался примерно так:Сейчас я хочу вместо интов пихать в Tag некий класс SomeDataHolder, в числе полей которого есть тот самый int.
Что мне надо сделать, чтобы все вынимания int'а не поломались ? (и вообще возможно ли это ?)
не работает для (int)theObj.Tag; но работает для (int)((SomeDataHolder)theObj.Tag);