1

Во-первых, да, я видел эти сообщения:
Is there an easy way in C# to have conditional compilation symbols based on OS version
Conditional compilation depending on the framework version in C#
, но они не нацелены на направление я ищу.C# условной компиляции переменных на основе версии ОС

То, что я ищу конкретно является переменной квалификации _type_ по версии ОС:

public struct REPASTESPECIAL 
{ 
    UInt32 dwAspect; 
#if WINVER >= 6.0 
    UIntPtr dwParam; 
#else 
    UInt32 dwParam; 
#endif 
} 

Я не хочу, чтобы вернуться к чему-то вроде этого:

public struct REPASTESPECIAL<T> 
{ 
    UInt32  dwAspect; 
    T dwParam; 
} 
// return type by OS version 
public static Type GetRePasteSpecial_ParamType() 
{ 
    if (Environment.OSVersion.Version.Major >= 5) return typeof(IntPtr); 
    else return typeof(UInt32); 
} 

.. .as, что позволило бы программистам использовать любой объект типа T, когда я хочу, чтобы dwParam был только объектом IntPtr или UInt32, но если я так должен быть таким и сделать это ссылка для других, которые ищут то же самое.

+0

Ваш первый пример кажется кошерным в Visual Studio 2010. Вы получаете сообщение об ошибке? – bluevector

ответ

3

Нет - условная компиляция работает на компиляции времени, в то время как он выглядит, как вы после того, как что-то, который работает в исполнения времени.

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

+0

Если это так, то @ChristopherWalker должен будет вернуться к чему-то по строкам своего второго примера кода. Возможно, UberRuntimeConcreteTypeDucker. – bluevector

+0

@jonnyGold: Потенциально, да. Или какая-то совершенно другая схема - но определенно * не * условная компиляция. –

+0

Если бы я использовал второй пример, вопрос заключался бы в том, как разрешить программистам использовать только один из двух применимых типов переменных ... – TekuConcept

2

Ответ: «У меня есть некоторые уродливые логики, что я боюсь, что будет неправильно, если я подвергать его другим»

разоблачить приятный и полезный API, который не позволить каких-либо злоупотреблений. Объявите все типы interop как внутренние классы и структуры реализации f вы хороший API, нет никакой ценности, чтобы сделать самые внутренние классы, такие как REPASTESPECIAL, общедоступными/полезными.

Таким образом, вы можете скрыть уродливые типы класса/структуры и динамически выбирать реализацию конкретной ОС в случае необходимости.

Если этот образовательный проект - это было бы хорошее место, чтобы узнать о dependency injection, чтобы настроить правильную реализацию во время выполнения.

+0

Итак, что вы предлагаете: использование 'internal' для структуры и просто отправить компилированную dll с общедоступной оболочкой? 'internal struct REPASTESPECIAL ' '{UInt32 dwAspect; T dwParam; } '
@ ИЗОБРЕТЕНИЕ: Я пытаюсь понять весь потенциал элементов управления RichEdit на C# - http://msdn.microsoft.com/en-us/library/windows/desktop/ff486017(v=vs.85). aspx - я только что закончил создание класса UserUtils с таким количеством структур, сообщений и других кодов и методов. Затем я использую этот класс в расширенном элементе управления RichTextBox. – TekuConcept

+0

Зависит от ваших целей. Если вы хотите использовать API-интерфейс - вам нужно работать над его созданием, если вы просто хотите иметь вспомогательные объекты для работы с RichEdit в основном для себя - для этого достаточно хороших структур и класса UserUtils. То есть Объект FileStream мог быть создан как набор методов-обложек поверх функций CreateFile/ReadFileEx, но вместо этого он превращался в один из классов Stream, разделяющих общий интерфейс и в результате интегрировался с остальными объектами IO, такими как читатели и писатели. –

Смежные вопросы