Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
6 / 6 / 5
Регистрация: 15.05.2014
Сообщений: 104

Скрыть метод от рефлексии

17.04.2019, 16:45. Показов 2124. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть следующий код. Требуется, чтобы после вызова метода HideBar, метод Bar не попадал в массив MethodInfo, при вызове метода GetMethods(). То есть, в следующием коде должно быть выведено 2 раза pass. Изменять код класса Program нельзя.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using System.Linq;
using System.Reflection;
 
public class Foo
{
    public void Bar()
    {
    }
 
    public void HideBar()
    {
 
    }
}
 
public class Program
{
    public static void Main(string[] args)
    {
        var foo = new Foo();
        MethodInfo barMethodInfo;
 
        barMethodInfo = foo.GetType().GetMethods().FirstOrDefault(m => m.Name == "Bar");
        if (barMethodInfo != null)
            Console.WriteLine("pass");
        else
            Console.WriteLine("fail");
 
        foo.HideBar();
        barMethodInfo = foo.GetType().GetMethods().FirstOrDefault(m => m.Name == "Bar");
        if (barMethodInfo == null)
            Console.WriteLine("pass");
        else
            Console.WriteLine("fail");
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.04.2019, 16:45
Ответы с готовыми решениями:

Помогите вытащить метод для элемента массива с помощю рефлексии
помогите вызвать метод елемента массива, который являеться екземпляром класса и имеет свои методы class Group { public...

С помощью рефлексии нужно вызвать метод динамически подключенной библиотеки
С помощью рефлексии нужно вызвать метод динамически подключенной библиотеки. Делаю так: private void InvokeMethod(MethodInfo info,...

Вызвать метод из класса MyArray при помощи рефлексии
Помогите пожалуйста со следующим вопросом: есть метод в классе MyArray, который надо вызвать при помощи рефлексии и передать туда массив...

4
 Аватар для netBool
325 / 304 / 173
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
17.04.2019, 16:54
Цитата Сообщение от kquick Посмотреть сообщение
Требуется, чтобы после вызова метода HideBar, метод Bar не попадал в массив MethodInfo
Сомневаюсь, что это возможно, во всяком случае без серьезного вмешательства в работу виртуальной .NET-машины

Максимум, что можно попробовать - использовать свойство атрибута метода в качестве флага, чтобы отфильтровать в GetMethods, что-то в таком духе::
C#
1
2
3
barMethodInfo = foo.GetType().GetMethods()
        .Where(m=>(m.GetCustomAttributes().First() as MyAttribute).MyPropperty == True)
        .FirstOrDefault(m => m.Name == "Bar");
1
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
17.04.2019, 17:09
Если я правильно понял задачу, то скорее всего никак. Вобще существует аттрибут SecurityCriticalAttribute, который запрещает обращаться к объекту через рефлексию, но он не мешает получить о нем информацию.
1
6 / 6 / 5
Регистрация: 15.05.2014
Сообщений: 104
17.04.2019, 17:20  [ТС]
Чтобы при вызове метода GetMethods не получается. Однако, можно написать свой собственный FirstOrDefault. И там задать это поведение, чтобы код класса Program работал как ожидается:

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.Linq;
using System.Reflection;
 
public class Foo
{
    public void Bar()
    {
    }
 
    public void HideBar()
    {
        MethodInfoExtensions.IsBarHidden = true;
    }
}
 
public static class MethodInfoExtensions
{
    public static bool IsBarHidden = false;
 
    public static MethodInfo FirstOrDefault(this MethodInfo[] sequence, Func<MethodInfo, bool> predicate)
    {
        return IsBarHidden ? null : typeof(Foo).GetMethod("Bar");
    }
}
 
public class Program
{
    public static void Main(string[] args)
    {
        var foo = new Foo();
        MethodInfo barMethodInfo;
 
        barMethodInfo = foo.GetType().GetMethods().FirstOrDefault(m => m.Name == "Bar");
        if (barMethodInfo != null)
            Console.WriteLine("pass");
        else
            Console.WriteLine("fail");
 
        foo.HideBar();
        barMethodInfo = foo.GetType().GetMethods().FirstOrDefault(m => m.Name == "Bar");
        if (barMethodInfo == null)
            Console.WriteLine("pass");
        else
            Console.WriteLine("fail");
    }
}


Остается еще как-то добавить в свой собственный FirstOrDefault, вызов стандартного FirstOrDefault.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
17.04.2019, 17:25
Лучший ответ Сообщение было отмечено kquick как решение

Решение

Цитата Сообщение от kquick Посмотреть сообщение
можно написать свой собственный FirstOrDefault
... который будет работать только в пределах видимости этого класса при условии, что он "ближе" к точке вызова, чем одноименный метод из пространства System.Linq.
То есть весьма ненадежное решение.

Цитата Сообщение от kquick Посмотреть сообщение
Остается еще как-то добавить в свой собственный FirstOrDefault, вызов стандартного FirstOrDefault.
C#
1
System.Linq.Enumerable.FirstOrDefault(sequence, predicate);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.04.2019, 17:25
Помогаю со студенческими работами здесь

Скрыть QCombobox если не сработал метод activated()
У меня есть QCombobox cmb который скрывается после выбора item`a в выпадающем его списке и появляется(скрывается) при нажатии на кнопку...

Какой метод может отобразить или скрыть слайдер?
Опять застрял на очень простом вопросе:cry: Есть слайдер, по умолчанию он скрыт. Нужно в игре по касанию тригера отображать слайдер,...

Избавление от рефлексии
Добрый день, уважаемые форумчане. Такой вопрос. Имеется несколько классов, которые запихиваются в List&lt;object&gt;. Классы обладают...

Рефлексии и аннотации
Мне дали такое задание: Создать класс, который может выполнять «тесты», в качестве тестов выступают классы с наборами методов с...

Задания по рефлексии
Подскажите хорошие жизненные задачи, на которых можно было бы освоить .NET Reflection API.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru