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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Reflection, зачем? Не ну я с теоритической точки :) 
:(
    Опции темы
Wizard_Memfis
Дата 22.10.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 12.2.2007
Где: г. Донецк, Украин а

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



Вот мне ОЧЕНЬ интересно а инфы найти как-то не удалось!
Вот и спрашиваю: ЗАЧЕМ БЫЛА ДОБАВЛЕНА ТАКАЯ ВОЗМОЖНОСТЬ?
Я все понимаю, что это класнно и гибко!Но а как же инкапсуляция?Зачем вообще тогда эти private and public??? smile 
--------------------
www.binary-studio.com
PM MAIL WWW ICQ Skype   Вверх
zaver
Дата 22.10.2007, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



есть другие варианты работы с интерфейсом сборки или класса, структуру которого ты точно не знаешь? (т.е. кроме Reflection)
PM MAIL WWW ICQ Skype YIM MSN   Вверх
archeg
Дата 22.10.2007, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Wizard_Memfis @  22.10.2007,  17:37 Найти цитируемый пост)
Зачем вообще тогда эти private and public???   

Рефлекшин - это не способ обхода привейт и паблик а способ анализа того чего ты не знаешь.

Не было бы рефлекшина - не было бы такой утилиты как Lut Roede`s .NET Reflector. Не было бы поддержки плагинов в программах. Не было бы частой гибкости (взять даже пример с поздним связыванием при разработке прилож, общ с екселем - без рефлекшина такое приложение смогло бы работаь только с конкретной версией екселя). Я уже не говорю про такие вещи как например ремоутинг, где проксиобъект создается с помщью рефлекшина, анализуя удаленный объект.
Рефлекшин служит для анлиза кода, и вызова методов сигнатуру которых ты не знаешь - очень мощная штука и считается одной из самых-самых мощных "фишек" .нета. Без рефлекшина сама технология .нет не смогла бы существовать.

Это сообщение отредактировал(а) archeg - 22.10.2007, 21:22


--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
tol05
Дата 22.10.2007, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

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



Еще два важных момента рефлексии :
- с помощью ее ты можешь расширять синтаксис языка программирования и директив среде выполнения до бесконечности! Хотелось ли тебе, хоть раз, не искать комбинацию ключевых слов, операторов и директив, а просто написать в коде
Код

//не показывай это свойство клиенту, если он не перевел мне на счет денег
//вот в этом методе все данные нужно форматировать бинарно если они библиотеку вызывает COM-компонент или в виде XML, если - .Net-программа
//это свойство дебаггером не дебагать, брейкпоинты не разрешать, просто проходить мимо него.

и т.д.

- рефлексия дает возможность декларативного программирования. А это позволяет:
а) явно указывать на различия в поведении кода в зависимости от того, в каких условиях этот самый код работает
б) за счет анализа этих самого кода и упомянутых условий его работы можно пропускать компиляцию, загрузку в память, выполнение целых модулей, не только фрагментов - т.е. оптимизировать run-time performance. Да, рефлексия - это тормоз для неумелого использования, но и "книга заклинаний" - для специалиста.  smile 

А по поводу инкапсуляции...  рефлексия ее не нарушает. Попробуй с ее помощью получить доступ к private-полю или запретить public... Получится? Но зато рефлексию ты выучишь в любом случае smile

Это сообщение отредактировал(а) tol05 - 22.10.2007, 22:36


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Wizard_Memfis
Дата 23.10.2007, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 12.2.2007
Где: г. Донецк, Украин а

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



Че то я не понял:
Цитата

А по поводу инкапсуляции...  рефлексия ее не нарушает. Попробуй с ее помощью получить доступ к private-полю или запретить public... Получится?

А так:
Код

MyClass o = new MyClass ();
Type type = o.GetType();
FieldInfo privateField= type.BaseType.GetField("_privateField", BindingFlags.Instance | BindingFlags.NonPublic);
if (null == privateField)
{
          throw new Exception("Cannot access _privateFieldfield!");
}
PrivateField obj= new PrivateField ();
object value = obj;
privateField.SetValue(o, value );


Добавлено через 5 минут и 55 секунд
Аналогично для метода: 
Код

MyClass o = new MyClass ();
Type type = o.GetType();
MethodInfo info = type.GetMethod("privateMethod", BindingFlags.Instance | BindingFlags.NonPublic);
if (null == info)
{
          throw new Exception("Cannot access privateMethod method!");
}
object[] vars = { image };
(object)result = (object)info.Invoke(o, vars);


Это сообщение отредактировал(а) Wizard_Memfis - 23.10.2007, 09:01
--------------------
www.binary-studio.com
PM MAIL WWW ICQ Skype   Вверх
tol05
Дата 23.10.2007, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

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



Я еще вчера понял, что именно зацепят за именно строки...  smile

Я неправильно выразился... 

Да, получить доступ к значению конечно можно. Я имел в виду изменить не значение, а доступность члена в принципе. Доступность для вызывающего кода или для производных классов.
Часто задают вопрос "вот у меня в базовом классе свойство public, как его в производном запретить"
Рефлексия не позволяет изменить семантику типа, только узнать ее или узнать и изменить содержание конкретного экземпляра.

А о нарушении инкапсуляции можно говорить только рассматривая тип, а не его конкретный экземпляр №225.

Короче, прокололся я... Мне минус! smile


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Wizard_Memfis
Дата 23.10.2007, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 12.2.2007
Где: г. Донецк, Украин а

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



О!Вот теперь понятно!Это я значит неправильно понимал инкапсуляцию( только на объектном уровне!)! smile 
Насчет минуса не знаю, а вот плюс за помощь точно заработал!Тока вот добавить пока не могу! smile 

Это сообщение отредактировал(а) Wizard_Memfis - 23.10.2007, 09:28
--------------------
www.binary-studio.com
PM MAIL WWW ICQ Skype   Вверх
tol05
Дата 23.10.2007, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

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



ну слава Богу! Значит я все-таки достаточно удачно "соскочил"  smile 


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
svintuss
Дата 24.10.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Мне в одном проекте рефлексия очень пригодилась. Проект состоял из кучи сборок, которые компилировал заказчик при помощи скрипта, который он упорно не хотел править. Поэтому сборки всегда компилятся в строго определенном порядке. Получается, что сборки, когторые первыми компилятся не могут содержать референсы на более поздние.
Если класс А из сборки sA нуждается в экземпляре класса В из сборки sB то делаем  следующее. Объявляем в сборке sA интерфейс iB, подгоняем его под методы класса В. В сборке sB делаем референс на sA и объявляем класс В как public class B:sA.iB.
в классе А создаем объект класса В следующим образом:
iB ist = (iB)System.Activator.CreateInstanceFrom("sB.dll","sA.iB").Unwrap().
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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