[VS, плагин] Долго ли написать? проверка параметра на этапе компиляции

6yrop

плагин к Visual Studio.Net, который выполняет следующее. При нажатии кнопки Build происходит проверка доступных значений аргумента метода.
Есть метод void SomeMethod(string arg). Его вызывают указывая строковую константу SomeMethod(“Иванов”). Где-нибудь (например, в текстовом файле) храниться список допустимых значений аргумента arg. Плагин должен проверять, не опечатался ли кодировщик.

bleyman

хз.
Если речь о шарпе, то вижуальная студия для написания такого не нужна, вообще-то. Ну то есть находишь сурцы рефлектора (или сам разбираешься после чего делаешь всё что угодно.
Если сделать "всё что угодно" хорошо, то можно получить что-нить X-Sharp (или как эта приблуда называлась, не помню) с ценой порядка 500 баксов за копию.

Marinavo_0507

А enum не судьба сделать вместо string?

evgen5555

Ctrl+Shift+Space влом нажимать?

6yrop

X-Sharp
а можно поточнее ссылочку на это

6yrop

Ctrl+Shift+Space влом нажимать?
по-моему я не про то

6yrop

А enum не судьба сделать вместо string?
списки констант изначально находится во внешнем источнике, можно генерировать автоматически константы
const string Ivanov = "Иванов"
мы сейчас примерно так и поступаем, но это не очень удобно, появляется какое то лишнее звено
Плагин решал бы эту проблему более изящно.

Dasar

Кнопку сделать непроблема (на крайняк, можно просто добавить postbuild-event)
Основная сложность - это парсинг и анализ.
C#-парсеры видел несколько в инете, есть более-менее работающий парсер в R#.

bleyman

Между прочим, можно писать
const string Иванов = "Иванов";
Но так писать не надо, так пишут тупые насильники. Писать нужно так:
enum Name
{
Иванов,
Петров,
Сидоров,
}
string NameToString(Name name)
{
return Enum.GetName(typeof(Name name);
}

Dasar

> Но так писать не надо, так пишут тупые насильники. Писать нужно так:
Это если код пишется руками.
Если код генерится, то лучше все-таки так:

class Сотрудники
{
public const string Иванов_И_И = "Иванов И. И.";
public const string Петров_К_Л = "Иванов К. Л.";

public static string[] Все = new string[]
{
Иванов_И_И,
Петров_К_Л
};
};

6yrop

Но так писать не надо, так пишут тупые насильники. Писать нужно так:
а вызовы будут так выглядеть

MyClass.Иванов

MyClass.NameToString(Name.Иванов)
по-моему первое гораздо симпатишнее

bleyman

Нах?
По-моему, enum лучше чем массив. Ты свой массив вообще использовать как собираешься? Я вот не представляю, что с ним можно сделать. Так что остаются константы, а про константы уже неоднократно было сказано, что они - зло.
В крайнем случае можно сделать енум как у меня, а потом в NameToString сделать выборку из такого же массива как у тебя (только в нём имена с точками и пробелами). Вот.

bleyman

Ну не знаю, короче. Вопрос вкуса =)

Dasar

> Нах?
Потому что target-функция все равно принимает string.
Соответственно непонятно: где тогда будет использоваться enum, и куда девать тормоза при переводе из enum-а в строку?

Dasar

> Так что остаются константы, а про константы уже неоднократно было сказано, что они - зло.
Почему? Разве было какое-то обсуждение с такими выводами?

bleyman

Ну хз словом. Если ты константы заныкаешь в каком-нить классе - тогда да, пожалуй достаточно удобно получится.

6yrop

Основная сложность - это парсинг и анализ.
а пространство имен System.CodeDom для этого нельзя заюзать?
кто-нибудь его использовал?

Dasar

> пространство имен System.CodeDom для этого нельзя заюзать?
там нет парсера

rosali

Основная сложность - это парсинг и анализ.
Да не нужно никакого парсера, студия постоянно код в распарсеном состоянии хранит, чтобы синтаксические ошибки подсвечивать, надо именно плагин писать, пусть он вообще, не во время Build ругается, а сразу когда набираешь - подсвечивает.
По любому, опыт "написать плагин к студии" в сто раз ценнее опыта "найти парсер C# и в нем копаться"!

bobby

Есть пространство Microsoft.CSharp
А ещё можно выдирать из сборки непосредственно мсил, причём средствами шарпа, причём из уже загруженной, я точно знаю. Могу узнать как.
Разрюхать плагиновое АПИ для вижуальника - это, конечно, прикольно, но к данной задаче неприменимо. Ну то есть бессмысленно это ИМХО, лучше пройтись по уже готовой ассебли в пост-билд степе.
А чо типа, переписать всё на енумы и обернуть все функции, требующие контроля, в обёртки, принимающие енумы (да, я именно поэтому хотел енумы, я вспомнил!) не поможет? Прекрасное средство, и даже в рамках парадигмы.
//Fj

Dasar

> Есть пространство Microsoft.CSharp
Именно там парсера и нет.
http://rsdn.ru/Forum/?mid=447694
> А ещё можно выдирать из сборки непосредственно мсил
С текстом, до компиляции, работать намного проще, т.к. в msil-е часть данных уже теряется по отношению к исходнику.

rosali

лучше пройтись по уже готовой ассебли в пост-билд степе
И что сделать-то?
Там даже вызов функции явно не провязан с параметрами, нужно IL интерпретировать, чтобы разобрать, что к чему относится. Я уже молчу о том, что System.Reflection _не_ обеспечивает доступ к коду, а только к метаданным, придется что-то доморощенное искать... Зачем говорить, если не знаешь
Оставить комментарий
Имя или ник:
Комментарий: