Обнаружение, определен ли класс / тип перед компиляцией - PullRequest
4 голосов
/ 05 октября 2011

Это похоже на несколько других тем, которые я нашел, но я еще не нашел ответ, который мне нужен. Я был бы признателен за прямой ответ, даже если это «нет, вы не можете этого сделать».

Есть ли способ использовать один блок кода, если класс / тип существует, и другой, если его нет. Результат будет таким же, как при использовании директив препроцессора, но без необходимости #define и ручного комментирования или отмены комментариев в файле.

Это может быть особый вариант использования. Я не уверен. Я работаю в среде, где наборы файлов могут быть установлены или нет, прежде чем что-либо скомпилировано. Таким образом, кто-то может купить плагин, который будет «установлен» (файлы, добавленные в проект), который делает классы / типы доступными для использования (например, расширение API). Мне нужно предоставить обходной путь, если у кого-то нет ни одного из наших других пакетов плагинов. Я надеюсь, что в этом есть смысл.

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

например. Я знаю, что это не работает, потому что он проверяет логическое значение, только если используется #define, но это иллюстрирует то, что я пытаюсь сделать ...

#if SomeType
    SomeType.DoSomething();
#else
    DefaultWay.DoSomething();

РЕДАКТИРОВАТЬ: я добавил это как предложение функции C #. Пожалуйста, проголосуйте здесь: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2297494-add-type-testing-as-preprocessor-directive

Я не понимаю, как рефлексия могла бы сделать это, но я новичок в C #, поэтому примеры использования переизбрания, если это возможно, были бы хорошими.

Ответы [ 3 ]

4 голосов
/ 05 октября 2011

Вместо использования инструкций перед компилятором (которые я не знаю, будут ли они работать в любом случае, если клиент не должен будет перекомпилировать после установки вашего плагина), я бы предложил запросить сборку и попытаться создать экземплярэкземпляр класса по строке, как показано здесь:

C # - правильный способ загрузки сборки, поиска класса и вызова метода ()

Assembly assembly = Assembly.LoadFile(@"C:\dyn.dll"); 
Type     type     = assembly.GetType("TestRunner");  

if (type != null)
    //Do Something

Редактирование, чтобы показать вызов Activator

, если type не равен null, тогда используйте это для создания экземпляра нужного типа.

var      obj      = Activator.CreateInstance(type); 
2 голосов
/ 05 октября 2011

Вы можете определить интерфейсы для ваших типов / сервисов, которые поддерживаются вашим кодом, предоставляемым для оценки, но не предоставляют.Тогда вы могли бы использовать плагин-фреймворк, такой как MEF , который встроен в .Net Framework (v4.0).

MEF сделает перечисление отражения и сборки за вас.Вам просто нужно определить простые точки расширения в вашем коде.

Вот некоторая базовая документация для MEF.Он может быть специфичен для версии кода Codeplex (не уверен), но он не должен быть слишком старым и дать вам хорошее представление о том, как он работает:

http://mef.codeplex.com/wikipage?title=Guide&referringTitle=Documentation

Альтернативные идеи

Возможно, вы захотите решить эту проблему с помощью лицензирования, а не распространения.

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

Если ваш код стоит распространять, вы не сможете предотвратить его распространение.Пиратство невозможно предотвратить.

И большинство лицензированного кода, который я использовал в последнее время, имеют полнофункциональные, но рассчитанные по времени пробные версии, и звонят домой.Они устанавливают весь код, но просто отключают его части, если они не лицензированы.Кому-то трудно понять, хотят ли они платить за ваши расширенные функции, если они не могут их опробовать:)

0 голосов
/ 05 октября 2011

Вас действительно волнует, что присутствует во время компиляции или во время выполнения?Возможно, вы сможете использовать шаблон Factory для инкапсуляции логики, для которой создается экземпляр класса, предполагая, что полиморфизм возможен (они оба имеют общий интерфейс или базовый класс).

...