Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Преобразование типов / 15 сообщений из 15, страница 1 из 1
30.10.2012, 21:23
    #38019374
hex.style
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Хотел узнать, возможно ли преобразовать класс к типу, заранее не зная этот тип, а получая его в виде Type?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
        public DataContextController(DataServiceContext context, Type contextType, String EntityName)
        {
            ServiceContext = context;
            ServiceContext.Credentials = System.Net.CredentialCache.DefaultCredentials;
            Binding = new DataServiceCollection<object>();
            ViewSource = new CollectionViewSource();
            // selectedOrders = context.Сущность.AddQueryOption("$top", "50"); - по сути хочу выполнить вот эту операцию, только с бубном:
           ((RequiredType)contextType.InvokeMember(RequiredType.Name,
                BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic, null, context, null)).
                AddQueryOption("$top", "50");
            ...
        }



Как в случае, когда есть возможность получить тип, но он заранее неизвестен, явно привести объект к этому типу?
Как тогда в этом случае использовать его методы, чтобы на этапе компиляции не получить ошибку?
Куда копать?
...
Рейтинг: 0 / 0
30.10.2012, 21:26
    #38019375
hex.style
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Код: c#
1.
        public DataContextController(DataServiceContext context, Type contextType,  Type RequiredType)


описался
...
Рейтинг: 0 / 0
31.10.2012, 11:47
    #38019815
Spinifex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
У Type есть методы: IsAssignableFrom и IsSubclassOf.
Но недостаток здесь, что в случае наличия операторов приведения типов будет выдаваться false...
Хотя вам может это и не нужно, а если нужно то можно написать свой extension метод:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public static bool IsCastableTo(this Type source, Type destination) 
{ 
        if (destination.IsAssignableFrom(source)) 
        { 
            return true; 
        }
        return source.GetMethods(BindingFlags.Public | BindingFlags.Static) 
                        .Any( 
                            m => m.ReturnType == destination &&  
                            m.Name == "op_Implicit" ||  
                            m.Name == "op_Explicit" 
                        ); 
} 
...
Рейтинг: 0 / 0
31.10.2012, 13:07
    #38019993
hex.style
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Это определит возможность приведения, но не позволит привести к типу.
Мне нужно привести к типу, чтобы использовать его методы.

На конкретном примере: context.Сущность.AddQueryOption("$top", "50");
Мы заранее не знаем, что context (типа Type contextType) содержит Сущность (типа Type RequiredType). Поэтому элемент танца с бубном номер раз будет вытаскивание поля Сущность:
Код: c#
1.
contextType.GetProperty("Сущность")



Далее нужно каким-то образом представить это поле в виде ((DataServiceQuery)contextType.GetProperty("Вагоны")) , чтобы вызвать метод AddQueryOption("$top", "50")

Но выдает ошибочку: e = {"Не найден метод \"System.Reflection.RuntimePropertyInfo.AddQueryOption\"."}
InvokeMember говорит примерно то же самое.

Тут я в замешательстве.
...
Рейтинг: 0 / 0
31.10.2012, 15:02
    #38020242
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
hex.styleЭто определит возможность приведения, но не позволит привести к типу.
Мне нужно привести к типу, чтобы использовать его методы.

На конкретном примере: context.Сущность.AddQueryOption("$top", "50");
Мы заранее не знаем, что context (типа Type contextType) содержит Сущность (типа Type RequiredType). Поэтому элемент танца с бубном номер раз будет вытаскивание поля Сущность:
Код: c#
1.
contextType.GetProperty("Сущность")




Далее нужно каким-то образом представить это поле в виде ((DataServiceQuery)contextType.GetProperty("Вагоны")) , чтобы вызвать метод AddQueryOption("$top", "50")

Но выдает ошибочку: e = {"Не найден метод \"System.Reflection.RuntimePropertyInfo.AddQueryOption\"."}
InvokeMember говорит примерно то же самое.

Тут я в замешательстве.
не осилил вашу проблему, скорей всего ошибка в логике
тем не менее могу предложить решение:

почему бы не использовать дженерик ?
public DataContextController<T>(DataServiceContext context, String EntityName)

а сам метод DataContextController конструировать и впоследствии вызывать как раз через рефлекшн в зависимости от типа
...
Рейтинг: 0 / 0
31.10.2012, 15:59
    #38020378
Spinifex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
М... действительно похоже на ошибку в логике. А как реализуется context через DynamicObject/ExpandoObject. Если нет то я бы попробовал начать с этого....
...
Рейтинг: 0 / 0
31.10.2012, 16:19
    #38020414
hex.style
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Программа состоит из модулей.
Каждый модуль содержит кучу View (XAML).
Каждая View может обращаться к веб-сервису (может и не одному).
Для всех View, я хочу построить класс DataContextController, в который передается ссылка на сервис и таблицу. Тип сервиса заранее неизвестен. View может конектиться к различным сервисам. В классе необходимо определить сервис, найти в нем запрашиваемую сущность, выбрать данные и вернуть список в одном из своих полей, к которому будет биндится DataGrid.

Пока реализую это с помощью делегата:
Код: c#
1.
2.
3.
4.
            data = new DataContextController(
                new Action<object>((j) => { ((CollectionViewSource)j).Source = context.Сущность.AddQueryOption("$top", "50"); })
            );
            DataContext = ((CollectionViewSource)data.ViewSource).View;



Но все же хочется все-таки логику взаимодействия с веб-сервисами типизировать и вынести в отдельный класс.
...
Рейтинг: 0 / 0
31.10.2012, 16:26
    #38020427
Spinifex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
hex.style,

Т.е. View Model знает о каких-то там таблицах. И если вы переименуете таблицу вам нужно будет еще и на UI ковыряться? Не очень то это здорово. Ну а для вашей проблемы хорошо подходит Dynamic, как я написал выше. Т.е. DataGrid у вас будет биндится к некоторому Dynamic.
...
Рейтинг: 0 / 0
31.10.2012, 19:25
    #38020679
hex.style
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
SpinifexТ.е. View Model знает о каких-то там таблицах. И если вы переименуете таблицу вам нужно будет еще и на UI ковыряться? Не очень то это здорово. Ну а для вашей проблемы хорошо подходит Dynamic, как я написал выше. Т.е. DataGrid у вас будет биндится к некоторому Dynamic.
Не таблицах. А вьюхах. Вся логика наименований и связей лежит на сервере приложений. Это удобно в разработке и поддержке.

Dynamic, мне кажется, тут ни при чем:
изначально есть объект сервиса и имя вьюхи (свойства этого сервиса).
Заранее предопределен метод этого свойства, который нужно вызвать, чтобы заполнить заранее известную коллекцию данными из вьюхи, имя которой изначально известно.

Что сделать удалось: получить объект вьюхи по заданному имени в этом классе (но в формате System.Reflection.RuntimePropertyInfo).

Проблема: не удается вызвать заранее известный метод этой вьюхи. Ругается, что этот метод (AddQueryOption) не доступен в System.Reflection.RuntimePropertyInfo. Следовательно, необходимо свойство сервиса привести к своему типу и вызвать пресловутый метод.
...
Рейтинг: 0 / 0
01.11.2012, 09:54
    #38021137
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
hex.styleПроблема: не удается вызвать заранее известный метод этой вьюхи. Ругается, что этот метод (AddQueryOption) не доступен в System.Reflection.RuntimePropertyInfo. Следовательно, необходимо свойство сервиса привести к своему типу и вызвать пресловутый метод.

ясен хрен System.Reflection.RuntimePropertyInfo не содержит метод AddQueryOption, не понятно почему ты там его ищешь
...
Рейтинг: 0 / 0
01.11.2012, 14:42
    #38021798
hex.style
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
pation, потому, что он содержит информацию о методе! В мсдн явный косяк в документации и класс не описан, но по идее он должен дать мне доступ к свойствам и методам объекта ( http://stackoverflow.com/questions/11615876/how-to-get-an-object-from-runtimepropertyinfo).
...
Рейтинг: 0 / 0
01.11.2012, 15:08
    #38021861
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
hex.style,
как же он содержит, если не содержит.
...
Рейтинг: 0 / 0
01.11.2012, 15:20
    #38021894
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
hex.style,
вы сначала должны получить объект , который выдает PropertyInfo, потом привести его.....
что там у вас, к интерфейсу IAddQueryOption, А ТОЛЬКО ПОТОМ ВЫЗВАТЬ МЕТОД ИНТЕРФЕЙСА AddQueryOption()
и то если объект не пустое место..
...
Рейтинг: 0 / 0
01.11.2012, 15:27
    #38021929
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
hex.stylepation, потому, что он содержит информацию о методе! В мсдн явный косяк в документации и класс не описан, но по идее он должен дать мне доступ к свойствам и методам объекта ( http://stackoverflow.com/questions/11615876/how-to-get-an-object-from-runtimepropertyinfo).

что то вы не понимаете
RuntimePropertyInfo -обеджит ИНФОРМАЦИЮ о свойстве: его типе, имени и тд.
Тип свойства назовём его T в свою очередь содержит кроме прочего ИНФОРМАЦИЮ о методах (например о методе AddQueryOption (если такой есть)), ета самая информация о етом самом методе (назовём её MethodInfo позволяет выполнить данный метод, для нужного экземпляра класса T)

ни у того ни другого не метода AddQueryOption
...
Рейтинг: 0 / 0
01.11.2012, 22:15
    #38022513
hex.style
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
pation, я передаю context - это объект, у которого есть поле, которое содержит этот метод.

Где-то в степи, во! А вот привести к интерфейсу - это хорошая идея, спасибо! Попробуем!
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Преобразование типов / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]