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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использование private методов из другого класса... это возможно??? Если да, то как? 
:(
    Опции темы
newsTester
  Дата 9.7.2008, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Только прошу без гнилых яблок и т.п....
Раньше писала на Java и была уверена что private метод на то и private что из других классов не виден. Теперь пришлось переходить на C# и, по идее, надо создать код обращающийся к private методам другого класса. При этом все лежит в одном Solution (кстати как это по русски будет?) и весь кодя я в принципе вижу, но менять мне его низзя.  smile 
Может это важно... класс нарушающий общее правило пространства видимости не простой, а NUnit_овский.

Это сообщение отредактировал(а) newsTester - 9.7.2008, 18:20
PM MAIL   Вверх
Freak_FB
Дата 9.7.2008, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ктулхувед
**


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

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



Приватные поля на то и придуманы, чтобы их никто посторонний не изменял. Должны быть предусмотрены методы или свойства, меняющие эти поля. Не иначе.


--------------------
user posted image
user posted image
Тонет Ктулху, все медведы горят в огне.
Я Креведко, очень страшно сегодня мне.

PM MAIL ICQ Skype GTalk Jabber   Вверх
newsTester
Дата 9.7.2008, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Приватные поля на то и придуманы, чтобы их никто посторонний не изменял.


Так я и думала  smile . Но вот один авторитетный дяденька говорит что с помощью класса Type эту схему можна нарушить... Хотя по моему это бред какой-то, но я ж толком С# не знаю - может он даже это позволяет....
PM MAIL   Вверх
PashaPash
Дата 9.7.2008, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

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



newsTester, 
Код

class PrivateFieldsClass
{ 
    private int myPrivateField = 0;
}

class Program
{
    static void Main(string[] args)
    {
        PrivateFieldsClass myObject = new PrivateFieldsClass();
        System.Reflection.FieldInfo fieldInfo = myObject.GetType().GetField("myPrivateField", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
        fieldInfo.SetValue(myObject, 42);

    }
}

Но лучше прислушайся к Freak_FB.


--------------------
PM MAIL WWW   Вверх
newsTester
Дата 9.7.2008, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



PashaPash. Видимо это и имелось ввиду  smile . А если у меня глобально класс ну... например internal? Это тоже как то обойти можно?
PM MAIL   Вверх
PashaPash
Дата 9.7.2008, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

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



newsTester, можно, но нельзя. smile


--------------------
PM MAIL WWW   Вверх
newsTester
Дата 9.7.2008, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

можно, но нельзя


по подробне бы, я ж не только в С# плаваю, но и в чтении чужих мыслей тоже... smile 
PM MAIL   Вверх
Partizan
Дата 9.7.2008, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



newsTester, аналогично через Reflection дёргаете тип класса, а затем создаёте экземпляр с помощью Activator.CreateInstance


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
nikitao
Дата 9.7.2008, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

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



newsTester,  вы уверены , что все так , как вы думаете ? smile  Все таки private на то и приват , чтобы не менять. Там должны быть Свойства , через которые вы можете получить "контрольный доступ " и полям , ну или ф-ции...


Цитата(newsTester @  9.7.2008,  19:15 Найти цитируемый пост)
Solution (кстати как это по русски будет?) 

По-русски - это солюшен , а по старо-русски - Решение.


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
newsTester
Дата 9.7.2008, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

вы уверены , что все так , как вы думаете ?   Все таки private на то и приват , чтобы не менять. 

Вы на 100% правы, но моя задача не использовать класс, а протестировать его работу. В том числе и работу приватной части. Ну и вот... поля и правда трогать может и не надо, а вот методы прийдется (.
Так что все из-за того что у меня задача специфическая.
PM MAIL   Вверх
newsTester
Дата 10.7.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

аналогично через Reflection дёргаете тип класса

всеравно не понятно...
Цитата

Код

System.Reflection.FieldInfo fieldInfo = myObject.GetType().GetField("myPrivateField", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);


в случае с полями уже был конкретный экземпляр класса и мы его анализировали, а если класс приватный то уже на этапе создания экземпляра класса надо применять Reflection, но как?
PM MAIL   Вверх
Partizan
Дата 10.7.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



newsTester, можете по имени сборки загрузить её экземпляр с помощью Assembly.Load а затем вызвать Assembly.GetTypes()...
после этого для нужного типа вызываете Activator.CreateInstance();


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
newsTester
Дата 2.8.2008, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



c private полями разобралась, со свойствами разобралась, с классами разобралвсь, а вот с методами - никак ( вот не вижу я как запустить метод и усе... smile . 
По идее должно быть как и со свойствами... но вот как?
PM MAIL   Вверх
Partizan
Дата 2.8.2008, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



Код

Type type = typeof(ИМЯ_КЛАССА_СОДЕРЖАЩЕГО_ПРИВАТНЫЙ_МЕТОД_GetDescription);
object invoker = Activator.CreateInstance(type);
MethodInfo mGetDescription = type.GetMethod("GetDescription", BindingFlags.NonPublic | BindingFlags.Instance);
object res = miGetDescription.Invoke(invoker, new object[]{});



--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
jonie
Дата 3.8.2008, 01:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



если имеете доступ к исходным кодам, тогда сделайте класс partial, допишите какой вам нужно код и тестируйте.
например : делаете свой солюшен, куда добавляете весь исходный солюшен, и еще один файл, содержащий в себе методы доступа к классу и его тестирования. 
думаю добавить одно слово к объявлению класса удобнее, нежели плясать с рефлексией ....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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