Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
30.10.2012, 21:23
|
|||
---|---|---|---|
|
|||
Преобразование типов |
|||
#18+
Хотел узнать, возможно ли преобразовать класс к типу, заранее не зная этот тип, а получая его в виде Type? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Как в случае, когда есть возможность получить тип, но он заранее неизвестен, явно привести объект к этому типу? Как тогда в этом случае использовать его методы, чтобы на этапе компиляции не получить ошибку? Куда копать? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.10.2012, 21:26
|
|||
---|---|---|---|
|
|||
Преобразование типов |
|||
#18+
Код: c# 1.
описался ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2012, 11:47
|
|||
---|---|---|---|
|
|||
Преобразование типов |
|||
#18+
У Type есть методы: IsAssignableFrom и IsSubclassOf. Но недостаток здесь, что в случае наличия операторов приведения типов будет выдаваться false... Хотя вам может это и не нужно, а если нужно то можно написать свой extension метод: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2012, 13:07
|
|||
---|---|---|---|
|
|||
Преобразование типов |
|||
#18+
Это определит возможность приведения, но не позволит привести к типу. Мне нужно привести к типу, чтобы использовать его методы. На конкретном примере: context.Сущность.AddQueryOption("$top", "50"); Мы заранее не знаем, что context (типа Type contextType) содержит Сущность (типа Type RequiredType). Поэтому элемент танца с бубном номер раз будет вытаскивание поля Сущность: Код: c# 1.
Далее нужно каким-то образом представить это поле в виде ((DataServiceQuery)contextType.GetProperty("Вагоны")) , чтобы вызвать метод AddQueryOption("$top", "50") Но выдает ошибочку: e = {"Не найден метод \"System.Reflection.RuntimePropertyInfo.AddQueryOption\"."} InvokeMember говорит примерно то же самое. Тут я в замешательстве. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2012, 15:02
|
|||
---|---|---|---|
Преобразование типов |
|||
#18+
hex.styleЭто определит возможность приведения, но не позволит привести к типу. Мне нужно привести к типу, чтобы использовать его методы. На конкретном примере: context.Сущность.AddQueryOption("$top", "50"); Мы заранее не знаем, что context (типа Type contextType) содержит Сущность (типа Type RequiredType). Поэтому элемент танца с бубном номер раз будет вытаскивание поля Сущность: Код: c# 1.
Далее нужно каким-то образом представить это поле в виде ((DataServiceQuery)contextType.GetProperty("Вагоны")) , чтобы вызвать метод AddQueryOption("$top", "50") Но выдает ошибочку: e = {"Не найден метод \"System.Reflection.RuntimePropertyInfo.AddQueryOption\"."} InvokeMember говорит примерно то же самое. Тут я в замешательстве. не осилил вашу проблему, скорей всего ошибка в логике тем не менее могу предложить решение: почему бы не использовать дженерик ? public DataContextController<T>(DataServiceContext context, String EntityName) а сам метод DataContextController конструировать и впоследствии вызывать как раз через рефлекшн в зависимости от типа ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2012, 15:59
|
|||
---|---|---|---|
|
|||
Преобразование типов |
|||
#18+
М... действительно похоже на ошибку в логике. А как реализуется context через DynamicObject/ExpandoObject. Если нет то я бы попробовал начать с этого.... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2012, 16:19
|
|||
---|---|---|---|
|
|||
Преобразование типов |
|||
#18+
Программа состоит из модулей. Каждый модуль содержит кучу View (XAML). Каждая View может обращаться к веб-сервису (может и не одному). Для всех View, я хочу построить класс DataContextController, в который передается ссылка на сервис и таблицу. Тип сервиса заранее неизвестен. View может конектиться к различным сервисам. В классе необходимо определить сервис, найти в нем запрашиваемую сущность, выбрать данные и вернуть список в одном из своих полей, к которому будет биндится DataGrid. Пока реализую это с помощью делегата: Код: c# 1. 2. 3. 4.
Но все же хочется все-таки логику взаимодействия с веб-сервисами типизировать и вынести в отдельный класс. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2012, 16:26
|
|||
---|---|---|---|
|
|||
Преобразование типов |
|||
#18+
hex.style, Т.е. View Model знает о каких-то там таблицах. И если вы переименуете таблицу вам нужно будет еще и на UI ковыряться? Не очень то это здорово. Ну а для вашей проблемы хорошо подходит Dynamic, как я написал выше. Т.е. DataGrid у вас будет биндится к некоторому Dynamic. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2012, 19:25
|
|||
---|---|---|---|
|
|||
Преобразование типов |
|||
#18+
SpinifexТ.е. View Model знает о каких-то там таблицах. И если вы переименуете таблицу вам нужно будет еще и на UI ковыряться? Не очень то это здорово. Ну а для вашей проблемы хорошо подходит Dynamic, как я написал выше. Т.е. DataGrid у вас будет биндится к некоторому Dynamic. Не таблицах. А вьюхах. Вся логика наименований и связей лежит на сервере приложений. Это удобно в разработке и поддержке. Dynamic, мне кажется, тут ни при чем: изначально есть объект сервиса и имя вьюхи (свойства этого сервиса). Заранее предопределен метод этого свойства, который нужно вызвать, чтобы заполнить заранее известную коллекцию данными из вьюхи, имя которой изначально известно. Что сделать удалось: получить объект вьюхи по заданному имени в этом классе (но в формате System.Reflection.RuntimePropertyInfo). Проблема: не удается вызвать заранее известный метод этой вьюхи. Ругается, что этот метод (AddQueryOption) не доступен в System.Reflection.RuntimePropertyInfo. Следовательно, необходимо свойство сервиса привести к своему типу и вызвать пресловутый метод. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.11.2012, 09:54
|
|||
---|---|---|---|
Преобразование типов |
|||
#18+
hex.styleПроблема: не удается вызвать заранее известный метод этой вьюхи. Ругается, что этот метод (AddQueryOption) не доступен в System.Reflection.RuntimePropertyInfo. Следовательно, необходимо свойство сервиса привести к своему типу и вызвать пресловутый метод. ясен хрен System.Reflection.RuntimePropertyInfo не содержит метод AddQueryOption, не понятно почему ты там его ищешь ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.11.2012, 14:42
|
|||
---|---|---|---|
|
|||
Преобразование типов |
|||
#18+
pation, потому, что он содержит информацию о методе! В мсдн явный косяк в документации и класс не описан, но по идее он должен дать мне доступ к свойствам и методам объекта ( http://stackoverflow.com/questions/11615876/how-to-get-an-object-from-runtimepropertyinfo). ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.11.2012, 15:08
|
|||
---|---|---|---|
|
|||
Преобразование типов |
|||
#18+
hex.style, как же он содержит, если не содержит. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.11.2012, 15:20
|
|||
---|---|---|---|
|
|||
Преобразование типов |
|||
#18+
hex.style, вы сначала должны получить объект , который выдает PropertyInfo, потом привести его..... что там у вас, к интерфейсу IAddQueryOption, А ТОЛЬКО ПОТОМ ВЫЗВАТЬ МЕТОД ИНТЕРФЕЙСА AddQueryOption() и то если объект не пустое место.. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.11.2012, 15:27
|
|||
---|---|---|---|
Преобразование типов |
|||
#18+
hex.stylepation, потому, что он содержит информацию о методе! В мсдн явный косяк в документации и класс не описан, но по идее он должен дать мне доступ к свойствам и методам объекта ( http://stackoverflow.com/questions/11615876/how-to-get-an-object-from-runtimepropertyinfo). что то вы не понимаете RuntimePropertyInfo -обеджит ИНФОРМАЦИЮ о свойстве: его типе, имени и тд. Тип свойства назовём его T в свою очередь содержит кроме прочего ИНФОРМАЦИЮ о методах (например о методе AddQueryOption (если такой есть)), ета самая информация о етом самом методе (назовём её MethodInfo позволяет выполнить данный метод, для нужного экземпляра класса T) ни у того ни другого не метода AddQueryOption ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=20&mobile=1&tid=1405722]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 159ms |
0 / 0 |