Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как узнать, есть ли у метода какой-либо код (тело)? / 9 сообщений из 9, страница 1 из 1
29.06.2014, 15:53
    #38683049
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, есть ли у метода какой-либо код (тело)?
Нужно выяснить, делает ли реализация метода хоть что-нибудь.
Что смог придумать:
Код: c#
1.
typeof(AnyType).GetMethod("MethodName").GetMethodBody().GetILAsByteArray().Length

если тела нет - возвращает 2

Опишу и общую задачу, на всякий.
Метод реализован всегда, этого требует absctract в базовом классе. Однако, он может ничего не делать, если это не нужно в конкретном подклассе.

В другом месте есть контрольная точка: если метод ничего не делает, то один из параметров может быть пустым, если делает - генерируется ошибка, значит программер накосячил. То есть проверку можно в принципе сделать только в DEBUG-варианте и не вызывать в релизе.

В принципе, понимаю, что задачу можно реализовать иначе - заставить метод что-то возвращать, перевести его на virtual вместо abstract, но хотелось бы в таком варианте.
...
Рейтинг: 0 / 0
29.06.2014, 16:31
    #38683074
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, есть ли у метода какой-либо код (тело)?
Shocker.Proно хотелось бы в таком варианте.
идея - нездоровая

Shocker.ProВ другом месте есть контрольная точка: если метод ничего не делает, то один из параметров может быть пустым
это забота вызываемого, а не вызывающего
...
Рейтинг: 0 / 0
29.06.2014, 17:09
    #38683089
sphinx_mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, есть ли у метода какой-либо код (тело)?
Shocker.ProВ другом месте есть контрольная точка: если метод ничего не делает, то один из параметров может быть пустым, если делает - генерируется ошибка, значит программер накосячил. То есть проверку можно в принципе сделать только в DEBUG-варианте и не вызывать в релизеВижу как минимум, 2 варианта - "навскидку" и "в-лоб".
Раз:
Код: c#
1.
2.
3.
#if DEBUG
   // bla-bla-bla
#endif


Два:
Код: c#
1.
2.
3.
4.
5.
[Conditional("CONDITION1")]
public static void Method1(int x)
{
    // bla-bla-bla
}
...
Рейтинг: 0 / 0
30.06.2014, 08:28
    #38683324
LameUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, есть ли у метода какой-либо код (тело)?
Shocker.ProНужно выяснить, делает ли реализация метода хоть что-нибудь.
Что смог придумать:
Код: c#
1.
typeof(AnyType).GetMethod("MethodName").GetMethodBody().GetILAsByteArray().Length

если тела нет - возвращает 2

Опишу и общую задачу, на всякий.
М етод реализован всегда, этого требует absctract в базовом классе . Однако, он может ничего не делать, если это не нужно в конкретном подклассе.

В другом месте есть контрольная точка: если метод ничего не делает, то один из параметров может быть пустым, если делает - генерируется ошибка , значит программер накосячил. То есть проверку можно в принципе сделать только в DEBUG-варианте и не вызывать в релизе.

В принципе, понимаю, что задачу можно реализовать иначе - заставить метод что-то возвращать, перевести его на virtual вместо abstract, но хотелось бы в таком варианте.


Я вам настоятельно рекомендую исправить архитектуру в этой части. Что-то здесь неправильно.
Представте, что после вас придет другой разработчик, которому придется курить вашу рефлексию и понять зачем она здесь.
Намного проще все и правильнее все это исправить архитектурой. Resharper в помощь, чтобы не делать много рутинной работы если у вас много наследников от абстрактного класса.
...
Рейтинг: 0 / 0
30.06.2014, 10:51
    #38683440
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, есть ли у метода какой-либо код (тело)?
LameUserПредставте, что после вас придет другой разработчик, которому придется курить вашу рефлексию и понять зачем она здесь.естественно, это единственная строчка тщательно прокомментирована.

Кстати, немножко неправильно описал - реализовать метод обязывает интерфейс. Но реализация может быть пустой.

Изопропилэто забота вызываемого, а не вызывающегоНу так о вызываемом и речь. Некто создает экземпляр подкласса и инициализирует его поля. Есть поле, условно говоря "текст сообщения об ошибке".
У подкласса есть метод "проверить на ошибку". Он вызывается "где-то потом", если чо - выведет пользователю указанное сообщение.

Так вот, если метод "проверить на ошибку" реально ничего не проверяет, то допустимо не задавать текст сообщения об ошибке, он все равно не понадобится. Но есть тело есть - сообщение обязано быть. Ловить косяк в момент срабатывания метода нелогично, ситуация может возникать раз в сто лет, а отловить неверную инициализацию подкласса можно довольно просто средствами базового класса и отлов произойдет сразу на этапе разработки при первом же запуске.

Поэтому я сделал такой "самоконтроль для программиста".
...
Рейтинг: 0 / 0
30.06.2014, 10:58
    #38683452
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, есть ли у метода какой-либо код (тело)?
Shocker.ProПоэтому я сделал такой "самоконтроль для программиста".
этот самоконтоль лучше вычистить.

Осетрина второй свежести не бывает.
Если требуется текст сообщения - значит требуется. Точка
...
Рейтинг: 0 / 0
30.06.2014, 11:08
    #38683466
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, есть ли у метода какой-либо код (тело)?
Shocker.Pro,
В принципе пойдет для тур дефранс, только проверить надо и для релиза, может быть и не два, (оптимизация компилятора)
...
Рейтинг: 0 / 0
30.06.2014, 11:10
    #38683468
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, есть ли у метода какой-либо код (тело)?
ИзопропилЕсли требуется текст сообщения - значит требуется. ТочкаЗачем писать текст, который заведомо не будет использоваться?
Ну хорошо, запретить пустую строку для сообщения. Программист будет писать "x$%", чтобы обойти ограничение пустой строки, так как он знает, что это сообщение никогда не появится.

Так вот важно, чтобы он не написал "x$%" (или пустую строку, что в данном случае проще) так, чтобы это увидел пользователь из-за ошибки программиста.

Это, в общем, такой, немного специфический контракт кода получается.
...
Рейтинг: 0 / 0
30.06.2014, 11:11
    #38683473
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, есть ли у метода какой-либо код (тело)?
Где-то в степитолько проверить надо и для релизав релизе этой проверки не будет
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как узнать, есть ли у метода какой-либо код (тело)? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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