Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Reflection, GetValue(), нужен объект 
:(
    Опции темы
namespace
Дата 10.1.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 4.7.2006

Репутация: нет
Всего: нет



пример:
Код

    class A
    {
        string x;
        B b;
    }
    class B
    {
        string xB;
    }
...
где-то
A a = new A();
...
а потом имеем объект свойства которого надо получить
o.GetType().GetProperty("x").GetValue(o, null); //работает
o.GetType().GetProperty("b").PropertyType.GetProperty("xB").GetValue(o, null); //а вот тут исключение

исключение что данный объект не содержит такого свойства, что указывать в качестве параметра ?

Это сообщение отредактировал(а) namespace - 10.1.2009, 11:11
PM MAIL   Вверх
Bishop
Дата 10.1.2009, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 3.6.2005
Где: Минск, Беларусь

Репутация: 6
Всего: 16



namespace, 
вероятно, нужно указывать o.b.

Вообще, этот код вызывает совсем другие исключения: во-первых x и b — поля, а не свойства, во-вторых они приватные, а не публичные, в-третьих b не инициализировано. И как o связано с a?
Как я понимаю, это не реальный код, а "сокращенный" для вопроса вариант. Но, какой вопрос — такой ответ:
Код
        class A
        {
            string x;
            B b = new B();
        }
        class B
        {
            string xB;
        }
A o = new A();
//…
o.GetType().GetField("x", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(o);
object ob = o.GetType().GetField("b", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(o);
(ob as B).GetType().GetField("xB", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(ob);

PM WWW ICQ   Вверх
mihryak
Дата 10.1.2009, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



4 проблемы в твоём коде
1. то, что ты хочешь вытащить - не свойства, а поля
2. для вытаскивания нужно указать BindingFlags - BindingFlags.Instance | BindingFlags.NonPublic в данном случае
3. конечно не содержит, ты ведь передаёшь туда экземляр А, у которого нет поля хВ
4. и первая строка не работает, не вводи людей в заблуждение

Код

            A a = new A();
            object b = a.GetType().GetField("b", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(a);
            object xB = b.GetType().GetField("xB", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(b);


Добавлено через 51 секунду
Bishop, опередил smile
PM MAIL ICQ   Вверх
nagg
Дата 10.1.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 6.1.2008
Где: Minsk

Репутация: нет
Всего: 4



Спасибо товаращам за обьяснение, а то после "правильной работы" первой строчки я впал в ступор  smile 

Это сообщение отредактировал(а) nagg - 10.1.2009, 12:44
--------------------
I am the State...
PM MAIL WWW ICQ Skype   Вверх
namespace
Дата 10.1.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 4.7.2006

Репутация: нет
Всего: нет



ну это же условно, проблема заключается в том что я не могу вытащить поле (или свойство, в данном случае не в этом дело) из объекта, который находиться в другом объекте, т. е. из объекта достать поле при помощи GetValue(объект, null) нормально, а вот из объекта1 достать объект2 и из него достать поле неполучается т.к. метод GetValue(объект1, null), не устраивает значение объект1. вобщем докапываюсь до нужного объекта, потом его свойства все находится, а вот GetValue() вызывает исключение, а я и не знаю какой объект ему передавать ведь он то у меня один - объект1, если ему нужен непосредственно объект2 находящийся в объект1, то как его получить? ведь в рефлекшене мы располагаем Type.

p.s. надеюсь изъяснился понятно  smile 

Это сообщение отредактировал(а) namespace - 10.1.2009, 16:00
PM MAIL   Вверх
mihryak
Дата 10.1.2009, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Цитата(namespace @  10.1.2009,  16:38 Найти цитируемый пост)
p.s. надеюсь изъяснился понятно
нет

напиши реальный код, который не работает, потому что ещё раз тщетно пытаться сопоставить действительную задачу приведённым условиям особого желания нет (у меня, по крайней мере)
и я , и Bishop написали, как получить объект2 и использовать его в дальнейшем, наши примеры рабочие
PM MAIL ICQ   Вверх
namespace
Дата 10.1.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 4.7.2006

Репутация: нет
Всего: нет



всем большое спасибо, проблема решена, не сообразил что получить объект2 из объекта1 можно при помощи того-же GetValue, дабы этот объект потом и использовать при получении нужных свойств
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0434 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.