Понятно как приводить к определенному типу переменную если мы знаеем ее заранее:
myobj = myvar as MyObj;
а если тип хранится в переменной
Type myobjtype = myobj.GetType();
то конструкция
myobj = myvar as myobjtype;
уже не прокатывает.
Как же все-таки привести переменную к нужному типу?
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 то зачем вообще нужно приведение?
Hello, wilwill!
w> Понятно как приводить к определенному типу переменную если мы знаеем ее w> заранее: myobj = myvar as MyObj; w> а если тип хранится в переменной w> Type myobjtype = myobj.GetType(); w> то конструкция w> myobj = myvar as myobjtype; w> уже не прокатывает. w> Как же все-таки привести переменную к нужному типу?
Здравствуйте, 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, то нужно использовать конструкцию:
Здравствуйте, 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());
)
W>а если тип хранится в переменной W>Type myobjtype = myobj.GetType(); W>то конструкция W>myobj = myvar as myobjtype; W>уже не прокатывает. W>Как же все-таки привести переменную к нужному типу?
А зачем, если не секкрет? Приведение типа, как я себе представляю, может потребоваться либо для доступа к членам имеющегося типа, скрытым по тем или иным причинам (неявная реализация интерфейсов, перегруженные через new методы и свойства). Когда же на этапе компиляции тип нам неизвестен, то пользы от приведения я не вижу .
либо для преобразования имеющегося экземпляра одного типа к экземпляру другого типа. Эта задача однозначно не решается. Можно воспользоваться TypeConverter, как посоветовали выше
, можно и просто 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.
Здравствуйте, 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
). А вот сколько нужно выкурить (ну, или на худой конец перепить) чтобы думать о том как приводить перменные тип которых не известен во время компиляции, я даже вообразить не моу. Для моего примитивного ума если тип переменной не известен до стадии компиляции, то возиться с ней можно только через рефлекшон (ну, или с помощь шамана и какой-то матери). Так что твоей вопрос меня ставит в тупик. (в лучшем случае)
Короче... каюсь. Нет тут ни буян-травы такой, ни хмеля подколодного. Так что если будешь рядом с нами, то делись сием зельем. Будем в месте думу думать под дурман траву.
ЗЫ
Шутю я... Но сказка дурь, но в ней намек...
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ctmike, Вы писали:
C>>Convert.ChangeType(value, valType);
VD>И что ты дальше будель делать с неизвестным типом?
Вообще-то я хочу сделать базовый класс, для сериализации списков ArrayList. Для успешной сериализации, нужно что бы this[] возвращал объект сериализируемого типа. Неохота переопределять this[] в каждом дочерном классе, поэтому и хочу сделать это в базовом классе.
Здравствуйте, wilwill, Вы писали:
W>Вообще-то я хочу сделать базовый класс, для сериализации списков ArrayList. Для успешной сериализации, нужно что бы this[] возвращал объект сериализируемого типа. Неохота переопределять this[] в каждом дочерном классе, поэтому и хочу сделать это в базовом классе.
Вообще возня с необернутым ArrayList это само по себе не здорово. Лучше всегда пользоваться типизироыанными коллекциями. Для их генерации можно пользоваться разными утилитами вроде КодСмита.
Ну, а что до сериализации, то она все же не основная функциональность программы и акцентировать внимание на нее не самый лучший подход.
В любом случае все требования о типах будут доступны при компиляции. А лучшим выходом тут будет использование дженериков и их ограничений.
Приведение же по рантайм-типу (Type) тут не причем.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, wilwill, Вы писали:
W>>Вообще-то я хочу сделать базовый класс, для сериализации списков ArrayList. Для успешной сериализации, нужно что бы this[] возвращал объект сериализируемого типа. Неохота переопределять this[] в каждом дочерном классе, поэтому и хочу сделать это в базовом классе.
VD>Вообще возня с необернутым ArrayList это само по себе не здорово. Лучше всегда пользоваться типизироыанными коллекциями. Для их генерации можно пользоваться разными утилитами вроде КодСмита.
Можно поподробнее, что за КодСмита?
VD>Ну, а что до сериализации, то она все же не основная функциональность программы и акцентировать внимание на нее не самый лучший подход.
У меня — одна из основных. Я храню пользовательские данные в файловой системе в xml (сериализированый ArrayList).
А объект ArrayList подключаю потом к гриду и весьма эффективно его юзаю. Плюс удобный поиск, такой какой я хочу — без реляционных БД с его SQL.
VD>В любом случае все требования о типах будут доступны при компиляции. А лучшим выходом тут будет использование дженериков и их ограничений.
VD>Приведение же по рантайм-типу (Type) тут не причем.
Почему?
Здравствуйте, 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.
Сейчас извращаюсь так:
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...
и т.д. для всех целых типов коих около десятка.
Хотелось бы чего покороче.