c# + explicit conversion + нубоквештн

Alena_08_11

в некое поле типа object пихался int и во многих местах кода доставался примерно так:

...
int val = (int) theObj.Tag; // Tag - это то самое поле типа object
...

Сейчас я хочу вместо интов пихать в Tag некий класс SomeDataHolder, в числе полей которого есть тот самый int.
Что мне надо сделать, чтобы все вынимания int'а не поломались ? (и вообще возможно ли это ?)

...
public static explicit operator int(SomeDataHolder dataHolder)
{
return dataHolder.IntValue;
}
...

не работает для (int)theObj.Tag; но работает для (int)((SomeDataHolder)theObj.Tag);

kill-still

Tag это поле, или свойство? ты с ним ничего не делал? (заслонял/переопределял/менял видимость)
Какого типа переменная theObj?
Показывай целиком код, тут не все телепаты.

Alena_08_11

Tag это Property типа System.Object с геттером и сеттером.
Вообще это 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 оказалось недостаточно (что в общем то по большому счету логично).

Serab

Ну как бэ ты наплевал на строгую типизацию, она утерлась, теперь придется решать проблему :)
Вообще, приведение типа — кривовато же выглядит, нет?
Надо находить все эти места, где Tag используется этим образом и менять. Сам с шарпом давно не работал, но вот тут Shurik недавно заявлял, что его среда умеет находить подобные вещи, надо бы спросить у него.

Dasar

Что мне надо сделать, чтобы все вынимания int'а не поломались ?
не получится. Преобразование object -> int - это всегда dynamic_cast и custom-ные преобразования при этом не проверяются

Alena_08_11

Вообще, приведение типа — кривовато же выглядит, нет?
Ну да, кривовато конечно. Надо было сразу для себя создавать какой нить 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. Всем спасибо.

bav46

а че мешает от cell отнаследоваться и расширить его до нужных вещей?

Alena_08_11

да ниче не мешает.
Когда архитектура будет до конца продумана, отрефакчу всё нахрен понормальному и опромышленю. А щас пока приходится лепить, просто чтоб работало.
Локальная автоматизация она такая локальная автоматизация ...
Оставить комментарий
Имя или ник:
Комментарий: