Re: как привести к типу в переменной
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.06.05 21:28
Оценка: :)
Здравствуйте, wilwill, Вы писали:

W>Понятно как приводить к определенному типу переменную если мы знаеем ее заранее:

W>myobj = myvar as MyObj;
W>а если тип хранится в переменной
W>Type myobjtype = myobj.GetType();
W>то конструкция
W>myobj = myvar as myobjtype;
W>уже не прокатывает.
W>Как же все-таки привести переменную к нужному типу?

Согласен. Мы тут тоже раздавили бутылку ноньяку на троих и еще я лично откушал пол литра какой-то дамы под назанием Лидия... Вот тоже сижу задаюсб филосовскими вопросами... Ну, типа от кого произошли диназавры... От куриц или ещо от кого... (Задалбал это Дискавари на этом НТВ+/-).

Что по поводу твоего вопроса, то точно могу сказать, что "если мы знаеем ее заранее:" и при этом делаем "myobj = myvar as MyObj;", то за это надо бить морду (ну, это понятно почему http://rsdn.ru/article/dotnet/asis.xml
Автор(ы): Владислав Чистяков (VladD2)
Дата: 18.12.2004
Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.


). А вот сколько нужно выкурить (ну, или на худой конец перепить) чтобы думать о том как приводить перменные тип которых не известен во время компиляции, я даже вообразить не моу. Для моего примитивного ума если тип переменной не известен до стадии компиляции, то возиться с ней можно только через рефлекшон (ну, или с помощь шамана и какой-то матери). Так что твоей вопрос меня ставит в тупик. (в лучшем случае)

Короче... каюсь. Нет тут ни буян-травы такой, ни хмеля подколодного. Так что если будешь рядом с нами, то делись сием зельем. Будем в месте думу думать под дурман траву.


ЗЫ

Шутю я... Но сказка дурь, но в ней намек...
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: как привести к типу в переменной
От: Аноним  
Дата: 13.06.05 00:33
Оценка: +1
Convert.ChangeType(value, valType);


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
как привести к типу в переменной
От: wilwill  
Дата: 11.06.05 21:10
Оценка:
Понятно как приводить к определенному типу переменную если мы знаеем ее заранее:
myobj = myvar as MyObj;
а если тип хранится в переменной
Type myobjtype = myobj.GetType();
то конструкция
myobj = myvar as myobjtype;
уже не прокатывает.
Как же все-таки привести переменную к нужному типу?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re: как привести к типу в переменной
От: GarryIV  
Дата: 11.06.05 21:24
Оценка:
Hello, wilwill!

w> Понятно как приводить к определенному типу переменную если мы знаеем ее

w> заранее: myobj = myvar as MyObj;
w> а если тип хранится в переменной
w> Type myobjtype = myobj.GetType();
w> то конструкция
w> myobj = myvar as myobjtype;
w> уже не прокатывает.
w> Как же все-таки привести переменную к нужному типу?

А какого типа переменная myobj? Если MyObj то почему не подходит первый ваирант? Если System.Object то зачем вообще нужно приведение?
Posted via RSDN NNTP Server 1.9
WBR, Igor Evgrafov
Re: как привести к типу в переменной
От: GarryIV  
Дата: 11.06.05 21:27
Оценка:
Hello, wilwill!

w> Понятно как приводить к определенному типу переменную если мы знаеем ее

w> заранее: myobj = myvar as MyObj;
w> а если тип хранится в переменной
w> Type myobjtype = myobj.GetType();
w> то конструкция
w> myobj = myvar as myobjtype;
w> уже не прокатывает.
w> Как же все-таки привести переменную к нужному типу?

И еще посмотри в сторону Type.IsAssignableFrom
Posted via RSDN NNTP Server 1.9
WBR, Igor Evgrafov
Re: как привести к типу в переменной
От: 0Z Россия http://www.ucca.ru
Дата: 11.06.05 21:52
Оценка:
Здравствуйте, wilwill, Вы писали:

W>Понятно как приводить к определенному типу переменную если мы знаеем ее заранее:

W>myobj = myvar as MyObj;
W>а если тип хранится в переменной
W>Type myobjtype = myobj.GetType();
W>то конструкция
W>myobj = myvar as myobjtype;
W>уже не прокатывает.
W>Как же все-таки привести переменную к нужному типу?
myobjtype — это переменная типа Type, а не типа переменной myobj.
Если тебе нужно получить новую переменную нужного типа из myobjtype, то нужно использовать конструкцию:
myobj = (SomeType)Activator.CreateInstance(myobjtype);
MCSD.NET << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re: как привести к типу в переменной
От: Avara  
Дата: 12.06.05 07:35
Оценка:
Здравствуйте, wilwill, Вы писали:

W>Понятно как приводить к определенному типу переменную если мы знаеем ее заранее:

W>myobj = myvar as MyObj;
W>а если тип хранится в переменной
W>Type myobjtype = myobj.GetType();
W>то конструкция
W>myobj = myvar as myobjtype;
W>уже не прокатывает.
W>Как же все-таки привести переменную к нужному типу?

Попробуй так: myobj = (new TypeConverter()).ConvertTo(myvar, myobj.GetType());
Re: как привести к типу в переменной
От: _FRED_ Черногория
Дата: 12.06.05 20:11
Оценка:
Здравствуйте, wilwill, Вы писали:

W>Понятно как приводить к определенному типу переменную если мы знаеем ее заранее:

W>myobj =  myvar as MyObj;


myobj = (MyObj)myvar;

Целый трактат на эту тему написан (здесь
Автор(ы): Владислав Чистяков (VladD2)
Дата: 18.12.2004
Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.


)

W>а если тип хранится в переменной

W>Type myobjtype = myobj.GetType();
W>то конструкция
W>myobj = myvar as myobjtype;
W>уже не прокатывает.
W>Как же все-таки привести переменную к нужному типу?

А зачем, если не секкрет? Приведение типа, как я себе представляю, может потребоваться
  1. либо для доступа к членам имеющегося типа, скрытым по тем или иным причинам (неявная реализация интерфейсов, перегруженные через new методы и свойства). Когда же на этапе компиляции тип нам неизвестен, то пользы от приведения я не вижу .
  2. либо для преобразования имеющегося экземпляра одного типа к экземпляру другого типа. Эта задача однозначно не решается. Можно воспользоваться TypeConverter, как посоветовали выше
    Автор: Avara
    Дата: 12.06.05
    , можно и просто Convert.ChangeType(...) и IConvertible. Но это всё при условии поддержки этих способов самими типами. Но это может и не получиться (например, никак, не подготовясь к этому заранее и не предвидя подобной ситуации, не привести переменную типа Int32 к SqlInt32 (разве что через рефлекшен операторы приведения искать)). В этом случае надо пробовать один метод, потом другой, потом третий, ... сколько придумаешь
under «*none*»,
... << RSDN@Home 1.1.4 beta 7 rev. 467>>
Help will always be given at Hogwarts to those who ask for it.
Re[2]: как привести к типу в переменной
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.06.05 07:44
Оценка:
Здравствуйте, ctmike, Вы писали:

C>Convert.ChangeType(value, valType);


И что ты дальше будель делать с неизвестным типом?
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: как привести к типу в переменной
От: wilwill  
Дата: 13.06.05 12:37
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, ctmike, Вы писали:


C>>Convert.ChangeType(value, valType);


VD>И что ты дальше будель делать с неизвестным типом?


Вообще-то я хочу сделать базовый класс, для сериализации списков ArrayList. Для успешной сериализации, нужно что бы this[] возвращал объект сериализируемого типа. Неохота переопределять this[] в каждом дочерном классе, поэтому и хочу сделать это в базовом классе.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[4]: как привести к типу в переменной
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.06.05 14:54
Оценка:
Здравствуйте, wilwill, Вы писали:

W>Вообще-то я хочу сделать базовый класс, для сериализации списков ArrayList. Для успешной сериализации, нужно что бы this[] возвращал объект сериализируемого типа. Неохота переопределять this[] в каждом дочерном классе, поэтому и хочу сделать это в базовом классе.


Вообще возня с необернутым ArrayList это само по себе не здорово. Лучше всегда пользоваться типизироыанными коллекциями. Для их генерации можно пользоваться разными утилитами вроде КодСмита.

Ну, а что до сериализации, то она все же не основная функциональность программы и акцентировать внимание на нее не самый лучший подход.

В любом случае все требования о типах будут доступны при компиляции. А лучшим выходом тут будет использование дженериков и их ограничений.

Приведение же по рантайм-типу (Type) тут не причем.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: как привести к типу в переменной
От: wilwill  
Дата: 13.06.05 20:05
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, wilwill, Вы писали:


W>>Вообще-то я хочу сделать базовый класс, для сериализации списков ArrayList. Для успешной сериализации, нужно что бы this[] возвращал объект сериализируемого типа. Неохота переопределять this[] в каждом дочерном классе, поэтому и хочу сделать это в базовом классе.


VD>Вообще возня с необернутым ArrayList это само по себе не здорово. Лучше всегда пользоваться типизироыанными коллекциями. Для их генерации можно пользоваться разными утилитами вроде КодСмита.


Можно поподробнее, что за КодСмита?

VD>Ну, а что до сериализации, то она все же не основная функциональность программы и акцентировать внимание на нее не самый лучший подход.

У меня — одна из основных. Я храню пользовательские данные в файловой системе в xml (сериализированый ArrayList).
А объект ArrayList подключаю потом к гриду и весьма эффективно его юзаю. Плюс удобный поиск, такой какой я хочу — без реляционных БД с его SQL.

VD>В любом случае все требования о типах будут доступны при компиляции. А лучшим выходом тут будет использование дженериков и их ограничений.


VD>Приведение же по рантайм-типу (Type) тут не причем.

Почему?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[6]: как привести к типу в переменной
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.06.05 22:03
Оценка:
Здравствуйте, wilwill, Вы писали:

W>Можно поподробнее, что за КодСмита?


Можно. Да поможет тебе гугль. Смит поишется так — smith...

W>У меня — одна из основных. Я храню пользовательские данные в файловой системе в xml (сериализированый ArrayList).

W>А объект ArrayList подключаю потом к гриду и весьма эффективно его юзаю. Плюс удобный поиск, такой какой я хочу — без реляционных БД с его SQL.

Хочешь добрый совет? Забудь про ArrayList. Храни и обрабатывай данные в DataSet. Там есть все что тебе нужно.

VD>>Приведение же по рантайм-типу (Type) тут не причем.

W>Почему?

Потому-что лишено смысла. Или ты знашь о типе в компайлтайме и можешь эффективно с ним работать. Или твоя судьба — это рефлекшен или генерация кода в рантайме. При этом все разговоры о приведениях типов практически лишены смысла.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: как привести к типу в переменной
От: Аноним  
Дата: 15.06.05 12:02
Оценка:
C>Convert.ChangeType(value, valType);

У меня похожая проблема.


Есть некая структурка с полями Byte, Int, UByte, UInt и т.п.
Устанавливаю этим полям значения через метод SetValue(object inst, object val) (см. Reflection.FieldInfo),
Есть переменная object, в кот. находится Int64.

Вот код:

object val = (Int64)1234;

fi.SetValue(inst,val); // InvalidCast
fi.SetValue(inst,Convert.ChangeType(fldval,fis[i].FieldType)); // OverflowException
fi.SetValue(inst,TypeDescriptor.GetConverter(fi.FieldType).ConvertFrom(val)); // NotSupportedException

Сейчас извращаюсь так:
if(fi.FieldType==typeof(Byte)) fi.SetValue(inst,(Byte)(Int64)val)
else if(fi.FieldType==typeof(SByte)) fi.SetValue(inst,(SByte)(Int64)val)
else if...
и т.д. для всех целых типов коих около десятка.
Хотелось бы чего покороче.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.