Всем привет, как элегантно конвертировать System.RuntimeType в конретный тип ?
Имею примерно такой снипет:
Dim p as PropertyDescriptor = propertyCollection.Find("PropertyName",False)
p.PropertyType возвращает переменную типа System.RuntimeType, мне же нужно вернуть
переменную типа p.PropertyType.ToString ili p.PropertyType.FullName.
Type.GetType(p.PropertyType.FullName) работает только с содержимым конретной сборки, грузить Assembly по ее физическому пути не кажется эленантным, хотелось бы что-то из области СType, но это с первого взгляда замкнутый круг — типа я не имею.
Прошу поделиться тех, кто рещил эту проблему.
TIA, Dima.
Неужели, ответа нет ??
Здравствуйте, nob113, Вы писали:
N>Всем привет, как элегантно конвертировать System.RuntimeType в конретный тип ?
N>Имею примерно такой снипет: N>Dim p as PropertyDescriptor = propertyCollection.Find("PropertyName",False)
N>p.PropertyType возвращает переменную типа System.RuntimeType, мне же нужно вернуть N>переменную типа p.PropertyType.ToString ili p.PropertyType.FullName.
N>Type.GetType(p.PropertyType.FullName) работает только с содержимым конретной сборки, грузить Assembly по ее физическому пути не кажется эленантным, хотелось бы что-то из области СType, но это с первого взгляда замкнутый круг — типа я не имею.
N>Прошу поделиться тех, кто рещил эту проблему. N>TIA, Dima.
Здравствуйте, nob113, Вы писали:
N>Имею примерно такой снипет: N>Dim p as PropertyDescriptor = propertyCollection.Find("PropertyName",False)
N>p.PropertyType возвращает переменную типа System.RuntimeType, мне же нужно вернуть
Ты ничего не путаешь?
[msdn]
PropertyDescriptor.PropertyType Property
When overridden in a derived class, gets the type of the property.
[ComVisible(true)]
public abstract Type PropertyType {get;}
Вроде нет, этот тип (как и все из Refelction) имеет тип System.RuntimeType. Я могу получить текствое представление через p.PropertyType.ToString, мне же нужна переменная типа p.PropertyType.ToString.
Смотрите на примере System.Web.Ui.WebControls.Table:
Dim o as New System.Web.Ui.WebControlsTable
Dim pCol as PropertyDescriptorCollection = TypeDescriptor.GetProperties(o)
Dim p as PropertyDescriptor = pCol.Find("Rows", False)
pCol = TypeDescriptor.GetProperties(p)
p = pCol.Find("Item", False)
p.PropertyType имеет тип System.Web.Ui.WebControls.TableRow, но я формально имею
p.PropertyType типа System.RuntimeType.
Мой вопрос как преобразовать System.RuntimeType -> System.Web.Ui.WebControls.TableRow.
Из Watch окна я могу видеть System.Web.Ui.WebControls.TableRow в дереве p.PropertyType, но как до него дотнуться ???
Код может содержать wee mistakes due to the fact that I typed it 'blindly'.
Спасибо.
Здравствуйте, Andy77, Вы писали:
A>Здравствуйте, nob113, Вы писали:
N>>Имею примерно такой снипет: N>>Dim p as PropertyDescriptor = propertyCollection.Find("PropertyName",False)
N>>p.PropertyType возвращает переменную типа System.RuntimeType, мне же нужно вернуть
A>Ты ничего не путаешь?
A>[msdn] A>PropertyDescriptor.PropertyType Property
A>When overridden in a derived class, gets the type of the property.
A>
A>[ComVisible(true)]
A>public abstract Type PropertyType {get;}
A>
Здравствуйте, nob113, Вы писали:
N>Вроде нет, этот тип (как и все из Refelction) имеет тип System.RuntimeType. Я могу получить текствое представление через p.PropertyType.ToString, мне же нужна переменная типа p.PropertyType.ToString.
Брр, типа p.PropertyType.ToString ?
N>p.PropertyType имеет тип System.Web.Ui.WebControls.TableRow, но я формально имею N>p.PropertyType типа System.RuntimeType.
Давай разбираться. p.PropertyType является объектом типа Type, его значение — typeof(TableRow).
N>Мой вопрос как преобразовать System.RuntimeType -> System.Web.Ui.WebControls.TableRow.
Имея тип, ты можешь создать экземпляр этого типа... а что тебе нужно?
N>Из Watch окна я могу видеть System.Web.Ui.WebControls.TableRow в дереве p.PropertyType, но как до него дотнуться ???
Konkretno poluchit' poluchit' instance objecta tipa 'System.Web.Ui.WebControls.TableRow', imeya object tipa System.RuntimeType (kak ja ponimau unasldeovanni ot System.Type).
Pri etom hotelos' bi izbegat' zagruzki assembly po ee fizicheskomu puti.
Spasibo and sorry for translit.
Здравствуйте, Andy77, Вы писали:
A>Здравствуйте, nob113, Вы писали:
N>>Вроде нет, этот тип (как и все из Refelction) имеет тип System.RuntimeType. Я могу получить текствое представление через p.PropertyType.ToString, мне же нужна переменная типа p.PropertyType.ToString.
A>Брр, типа p.PropertyType.ToString ?
N>>p.PropertyType имеет тип System.Web.Ui.WebControls.TableRow, но я формально имею N>>p.PropertyType типа System.RuntimeType.
A>Давай разбираться. p.PropertyType является объектом типа Type, его значение — typeof(TableRow).
N>>Мой вопрос как преобразовать System.RuntimeType -> System.Web.Ui.WebControls.TableRow.
A>Имея тип, ты можешь создать экземпляр этого типа... а что тебе нужно?
N>>Из Watch окна я могу видеть System.Web.Ui.WebControls.TableRow в дереве p.PropertyType, но как до него дотнуться ???
A>Скажи, что конкретно ты хочешь сделать...
Здравствуйте, nob113, Вы писали:
N>Konkretno poluchit' poluchit' instance objecta tipa 'System.Web.Ui.WebControls.TableRow', imeya object tipa System.RuntimeType (kak ja ponimau unasldeovanni ot System.Type).
Activator.CreateInstance(Type t);
N>Pri etom hotelos' bi izbegat' zagruzki assembly po ee fizicheskomu puti.
Если ты уже получил тип, то, значит, и сборка, содержащая этот тип, тоже загружена.
Vihodit, chto ne sovsem tak. Ja pravda proboval Type.GetType (ili typeof na C#) i ne rabotalo, hotya ja proimportiroval System.Web.UI.WebControls ...Ja poprobuu Activator.CreateInstance.
Spasibo, Dima.
Здравствуйте, Andy77, Вы писали:
A>Здравствуйте, nob113, Вы писали:
N>>Konkretno poluchit' poluchit' instance objecta tipa 'System.Web.Ui.WebControls.TableRow', imeya object tipa System.RuntimeType (kak ja ponimau unasldeovanni ot System.Type).
A>Activator.CreateInstance(Type t);
N>>Pri etom hotelos' bi izbegat' zagruzki assembly po ee fizicheskomu puti.
A>Если ты уже получил тип, то, значит, и сборка, содержащая этот тип, тоже загружена.
N>p.PropertyType возвращает переменную типа System.RuntimeType, мне же нужно вернуть N>переменную типа p.PropertyType.ToString ili p.PropertyType.FullName.
Что это значит?
По-моему, ты не совсем разобрался в том, что такое тип и т.д. Например typeof(System.String) возвращает объект типа System.RuntimeType. Подумай над этим
Ja poproboval cherez Activator.CreateInstance — ne rabotaet.... Govorit net takogo assembly System.Web.dll ili System.Web... A bez assembly tip ne prokanivaet o;(
Здравствуйте, Andy77, Вы писали:
A>Здравствуйте, nob113, Вы писали:
N>>Konkretno poluchit' poluchit' instance objecta tipa 'System.Web.Ui.WebControls.TableRow', imeya object tipa System.RuntimeType (kak ja ponimau unasldeovanni ot System.Type).
A>Activator.CreateInstance(Type t);
N>>Pri etom hotelos' bi izbegat' zagruzki assembly po ee fizicheskomu puti.
A>Если ты уже получил тип, то, значит, и сборка, содержащая этот тип, тоже загружена.
Sapsibo, ja ponimau eto, no moi vopros kak konvertirovat' System.RuntimeType to String ???
Здравствуйте, mihailik, Вы писали:
N>>p.PropertyType возвращает переменную типа System.RuntimeType, мне же нужно вернуть N>>переменную типа p.PropertyType.ToString ili p.PropertyType.FullName.
M>Что это значит?
M>По-моему, ты не совсем разобрался в том, что такое тип и т.д. Например typeof(System.String) возвращает объект типа System.RuntimeType. Подумай над этим
Amigo mihailik, тон используемый Вами, предпалагает некаторое знание придмета, какавое Вы, па маему скромнаму усматрению, не саблагавалили прадеманстравать... Сей код разъяснит Вам даступнее чем я Ващу неправату:
1 Dim s as String = "bullshite"
2 s = "test"
Линия 2 ставиться на Breakpoint — далее смотрится ее тип в Watch — он String и самсем не System.RuntimeType, for fuck sake. То же самае праисходит и с другими абъетами, абъявленными явно.
В свете всиво вышесказаннава, вапрос райзитца снова — уважаемые, как преобразавать RuntimeType в то, чем он в натуре яляется ?? Панятна, зачем Reflection и иже с ним ево исползуют, непонятна, как вернуть реальный тип.
Извините за неточнае испольщрвание компутерных термироф, думается, вопрос мой от этого непонятее не стал.
C уважением, Dima.
Здравствуйте, mihailik, Вы писали:
N>>p.PropertyType возвращает переменную типа System.RuntimeType, мне же нужно вернуть N>>переменную типа p.PropertyType.ToString ili p.PropertyType.FullName.
M>Что это значит?
M>По-моему, ты не совсем разобрался в том, что такое тип и т.д. Например typeof(System.String) возвращает объект типа System.RuntimeType. Подумай над этим
N>Ja poproboval cherez Activator.CreateInstance — ne rabotaet.... Govorit net takogo assembly System.Web.dll ili System.Web... A bez assembly tip ne prokanivaet o;(
System.Web только для WinNT/2000/Xp, на Win9x отсутствует.
Privet, net ge — mne nugna peremennaya tipa objecta, a ne string.
Nu smotrite — est' 2 choisa:
1-i choise:
Dim o as New System.Web.UI.WebControls.TableRow
— peremennaya o — hranit object tipa System.Web.UI.WebControls.TableRow
2-i choise:
Property MyProp as System.Web.UI.WebControls.TableRow
...
...
End property
Dim p as PropertyDescriptor = MyPropertyCollection.Find('MyProp", False)
p.PropertyType — imeet tip System.RuntimeType, mne ge hotsa ee convertirovat' v to, chem ona javlyaetsya po suti, a imenno System.Web.UI.WebControls.TableRow.
Vot...
Ponimaete, a kak eto sdelat', ja ne znau..
Sorry 4 inconvience — hope da reason is my poor explantaion...
Здравствуйте, mihailik, Вы писали:
N>>Sapsibo, ja ponimau eto, no moi vopros kak konvertirovat' System.RuntimeType to String ???
M>System.RuntimeType to String вот так:
M>System.RuntimeType.ToString()
M>
N>Amigo mihailik, тон используемый Вами, предпалагает некаторое знание придмета, какавое Вы, па маему скромнаму усматрению, не саблагавалили прадеманстравать... Сей код разъяснит Вам даступнее чем я Ващу неправату:
Да нет, ты не волнуйся. Мне-то по барабану, а вот тебе бы лучше разобраться в этом поподробнее. Ты на меня не равняйся, ты просто учись при первой возможности, такой совет.
N>1 Dim s as String = "bullshite" N>2 s = "test"
N>Линия 2 ставиться на Breakpoint — далее смотрится ее тип в Watch — он String и самсем не System.RuntimeType, for fuck sake. То же самае праисходит и с другими абъетами, абъявленными явно.
Тип переменной s — System.String. С VB я не очень знаком, надеюсь, ты в моём C# разберёшься.
Так вот, s.GetType()==typeof(System.String), то есть тип переменной s — System.String. Однако, тип сам является объектом в дотнете. Тип является объектом, тип не является классом. То есть тип — это объект.
Соответственно, у этого объекта в свою очередь есть тип. typeof(System.String).GetType(), вот как его можно получить. Или s.GetType().GetType(), два раза подряд. Тип объекта "тип", само собой является объектом. Все типы являются объектами. Все типы являются объектами System.RuntimeType.
Тут нужно немножко разделять. Обычно говорят, что тип — это объекты System.Type. Так вот, на самом деле все типы представлены объектом System.RuntimeType, который производный от System.Type. Улавливаешь интригу?
То есть, когда ты делаешь GetType() чему бы то ни было, ты в результате получаешь объект RuntimeType. Этот RuntimeType — представление типа. Сделаешь s.GetType() — получишь System.RuntimeType, который отвечает за тип "строка".
Возникает вопрос, а что тогда означает System.String? Это же, вроде, тоже тип "строка"? Тут стоит подумать самостоятельно, чтобы каши в голове не было. Подумай обязательно сам над этой хвилософией
Объекты типа "System.String" — это строки. То есть, если ты имеешь строку, то у тебя есть System.String. Тебе не нужно делать GetType() чтобы получить System.String, строка и есть System.String.
Тут бы и поставить точку. Но для полной утряски стоит ещё разобраться с ToString(). Когда ты выводишь на печать любой объект, он автоматически переводится в строку. Это делается при помощи ToString. Если выводить на печать объект типа System.RuntimeType, его функция ToString напечатает название типа. Поэтому s.GetType().ToString() возвращает "System.String".
Тут уж как ни возникнуть путанице: печатаем RuntimeType — оно выводит System.String. Само RuntimeType, а само печатает "System.String". Но ты пойми, если печатать строку, сама строка и напечатается, а никакой не "System.String".
В общем, подумай над этим сам. И нечего на меня обижаться, не понял-то ты. Документация была, как у всех, понимаешь, а не понял. Теперь вот самое время понять. Жил бы ты в Киеве, попили бы пивка, а так придётся тебе самому уж напрягаться насчёт пивка, а я уж обойдусь
N>p.PropertyType — imeet tip System.RuntimeType, mne ge hotsa ee convertirovat' v to, chem ona javlyaetsya po suti, a imenno System.Web.UI.WebControls.TableRow.
p.PropertyType не является System.Web.UI.WebControls.TableRow. Всё, что является TableRow — это TableRow. А PropertyType — это не TableRow, это тип, это объект, который представляет тип свойства. Тип одинаков у всех TableRow, в какой не ткни — все они имеют одинаковый тип.
Соответственно, если ты хочешь получить TableRow, то тебе не надо спрашивать у него тип.
По-моему, я понимаю что ты хочешь. Ты хочешь освободить мой разум. Тьфу, чёрт, насмотрелся на свою голову! Я имел ввиду, ты хочешь получить значение свойства у некоторого объекта. Если так, то скажи, ведь это несложно.
А если нет, тогда врубись как следует, что тебе надо, и объясни.
1. Тебе нужен тип, который имеет свойство?
2. Или тебе нужно значение свойства?
Если нужен тип — тогда p.PropertyType — это то, что ты ищешь. Не смущайся, что это RuntimeType. Это и есть тип. RuntimeType — это и есть тип. Обращайся с ним как с типом, он не обидится
Naschet piva, priezgai v nyc — naliu skolka vipiesh. A vot s tipami ti menya sovsem zaputal ... Ti egeli doka, tak otvet' kak mne v moiom sluchaje System.Web.UI.webControl — peremennuu poluchit', a esli ti teoriei promishlyaesh, tak ja tebe sam mogu lektsiu prochitat'.
Ne obessut', Dima.
Здравствуйте, mihailik, Вы писали:
N>>Amigo mihailik, тон используемый Вами, предпалагает некаторое знание придмета, какавое Вы, па маему скромнаму усматрению, не саблагавалили прадеманстравать... Сей код разъяснит Вам даступнее чем я Ващу неправату:
M>Да нет, ты не волнуйся. Мне-то по барабану, а вот тебе бы лучше разобраться в этом поподробнее. Ты на меня не равняйся, ты просто учись при первой возможности, такой совет.
N>>1 Dim s as String = "bullshite" N>>2 s = "test"
N>>Линия 2 ставиться на Breakpoint — далее смотрится ее тип в Watch — он String и самсем не System.RuntimeType, for fuck sake. То же самае праисходит и с другими абъетами, абъявленными явно.
M>Тип переменной s — System.String. С VB я не очень знаком, надеюсь, ты в моём C# разберёшься.
M>Так вот, s.GetType()==typeof(System.String), то есть тип переменной s — System.String. Однако, тип сам является объектом в дотнете. Тип является объектом, тип не является классом. То есть тип — это объект.
M>Соответственно, у этого объекта в свою очередь есть тип. typeof(System.String).GetType(), вот как его можно получить. Или s.GetType().GetType(), два раза подряд. Тип объекта "тип", само собой является объектом. Все типы являются объектами. Все типы являются объектами System.RuntimeType.
M>Тут нужно немножко разделять. Обычно говорят, что тип — это объекты System.Type. Так вот, на самом деле все типы представлены объектом System.RuntimeType, который производный от System.Type. Улавливаешь интригу?
M>То есть, когда ты делаешь GetType() чему бы то ни было, ты в результате получаешь объект RuntimeType. Этот RuntimeType — представление типа. Сделаешь s.GetType() — получишь System.RuntimeType, который отвечает за тип "строка".
M>Возникает вопрос, а что тогда означает System.String? Это же, вроде, тоже тип "строка"? Тут стоит подумать самостоятельно, чтобы каши в голове не было. Подумай обязательно сам над этой хвилософией
M>Объекты типа "System.String" — это строки. То есть, если ты имеешь строку, то у тебя есть System.String. Тебе не нужно делать GetType() чтобы получить System.String, строка и есть System.String.
M>Тут бы и поставить точку. Но для полной утряски стоит ещё разобраться с ToString(). Когда ты выводишь на печать любой объект, он автоматически переводится в строку. Это делается при помощи ToString. Если выводить на печать объект типа System.RuntimeType, его функция ToString напечатает название типа. Поэтому s.GetType().ToString() возвращает "System.String".
M>Тут уж как ни возникнуть путанице: печатаем RuntimeType — оно выводит System.String. Само RuntimeType, а само печатает "System.String". Но ты пойми, если печатать строку, сама строка и напечатается, а никакой не "System.String".
M>В общем, подумай над этим сам. И нечего на меня обижаться, не понял-то ты. Документация была, как у всех, понимаешь, а не понял. Теперь вот самое время понять. Жил бы ты в Киеве, попили бы пивка, а так придётся тебе самому уж напрягаться насчёт пивка, а я уж обойдусь
M>Бувай!
N>Naschet piva, priezgai v nyc — naliu skolka vipiesh. A vot s tipami ti menya sovsem zaputal ... Ti egeli doka, tak otvet' kak mne v moiom sluchaje System.Web.UI.webControl — peremennuu poluchit', a esli ti teoriei promishlyaesh, tak ja tebe sam mogu lektsiu prochitat'.
Чин по чину, нормально
Итак, про пиво. Нет, ладно, сначало про переменные. С твоим случаем я так и не ознакомился
. Попробую дедуктивно угадать.
Если ты хочешь у некоторого неизвестного объекта прочитать свойство, то дело в шляпе. В VB это очень легко:
Dim obj as System.Object
obj = someWebControlOwnerObject
Console.WriteLine( obj.MyProperty )
Может, я в VB мелочей и не знаю, но примерно так. То есть, System.Object это как в старом VB, как Variant. И к нему можно применять любые свойства, он будет через Reflection доставать. Если таких свойств нет, естественно, получаешь ошибку.
В C# такое не провернёшь, в C# позднего связывания нет. Приходится всё вручную. Если надо, я пропишу. Или, если интересует как собственно этот механизм "через Reflection" работает. Если в этом вопрос, скажи.
Smotri, mne nugno poluchit' object — ne string. Ja ne mogu operirovat' s System.RuntimeType tak, kak ja bi delal eto objectom — u nego sovsem drugije properties, eto ponyatno. Neugeli ja tak neponyatno objanyau, chto mne nugmo ????
Ti soglasen chto Property.PropertyType vsegda ralnogo tipa ? — naprimaer MyAssembly.MyClass. No formalni tip vozvrashaemogo vsegda System.RuntimeType. Ja ne mogu poparsit' System.RuntimeType — potomu chto eto tol'kp steklo, prozrachnoje no steklo. Ja vigu svoi object (ego tekstovoje predstavlenije — p.PropertyType.FullName, no ne imeu dostupa k nemu — vot chto mne nugno.
Nemnogo jasnee ? o
Здравствуйте, mihailik, Вы писали:
N>>Naschet piva, priezgai v nyc — naliu skolka vipiesh. A vot s tipami ti menya sovsem zaputal ... Ti egeli doka, tak otvet' kak mne v moiom sluchaje System.Web.UI.webControl — peremennuu poluchit', a esli ti teoriei promishlyaesh, tak ja tebe sam mogu lektsiu prochitat'.
M>Чин по чину, нормально M>Итак, про пиво. Нет, ладно, сначало про переменные. С твоим случаем я так и не ознакомился M>. Попробую дедуктивно угадать.
M>Если ты хочешь у некоторого неизвестного объекта прочитать свойство, то дело в шляпе. В VB это очень легко:
M>
M>Может, я в VB мелочей и не знаю, но примерно так. То есть, System.Object это как в старом VB, как Variant. И к нему можно применять любые свойства, он будет через Reflection доставать. Если таких свойств нет, естественно, получаешь ошибку.
M>В C# такое не провернёшь, в C# позднего связывания нет. Приходится всё вручную. Если надо, я пропишу. Или, если интересует как собственно этот механизм "через Reflection" работает. Если в этом вопрос, скажи.