2015-01-28 17 views
5

Choć powinno być niemożliwe ze względu na #define bycia dyrektywa pre-processor Chciałbym zapytać:Pobierz listę zmiennych #define

Czy to możliwe, aby uzyskać listę #define byłyby zmienne w ciągu rzeczywisty program? Odpowiednio, lista warunkowych symboli kompilacji, zdefiniowanych w ramach właściwości projektu.

Dlaczego miałbym tego potrzebować? Zarządzam rozszerzeniami za pomocą symboli. Próbuję uzyskać listę nich dodać je do mojego okna o jak

Enabled Extensions: 
CUSTOMER1_ABC_EXTENSION 
CUSTOMER2_XYZ_EXTENSION 

bez konieczności pisania kodu specyficznego dla każdego rozszerzenia.

+2

Powiązane: http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem –

+1

Możesz sprawdzić plik źródłowy w programie. –

+1

Roslyn, będąc kompilatorem jako usługą, może to zrobić. Zobacz https://github.com/dotnet/roslyn – haim770

Odpowiedz

0

rozwiązać go za pomocą

public static class BuildVariables 
{ 
    public static List<string> DefinedVariables = new List<string>() 
    { 
     #if CUSTOMER1_ABC_EXTENSION 
     "CUSTOMER1_ABC_EXTENSION", 
     #endif 
     #if CUSTOMER2_XYZ_EXTENSION 
     "CUSTOMER2_XYZ_EXTENSION", 
     #endif 
    }; 
} 

który jest dość brudny i wymaga zmiany za każdym razem nowy symbol jest wprowadzany. Nie podoba mi się to.

+0

@Sinatr Jest brudny, ponieważ zmusza programistę do zapamiętania, aby umieścić nowy symbol na liście. To nie problem - to tylko s * cks. I nie, nie mam kodu inicjalizatora ani wyszukiwania dla rozszerzeń. Byłbym szczęśliwy, gdybyś przestał zakładać rzeczy, których nie możesz znać. Rozszerzenia są raczej wbudowane niż oddzielny moduł lub takie. Czemu? Jak opisano powyżej, klasy reprezentujące tabele db są różne dla niektórych klientów. Dlatego włączam niektóre z nich przez symbol. Wiem, że TO jest brudną częścią tutaj, ale nie mam czasu, aby to naprawić, jak wspomniano powyżej. – SlapY

1

Wygląda na to, że odpowiedzą kanoniczną jest to, że nie możesz tego zrobić. Dokumentacja MSDN dla #define mówi:

Zasięg symbolu utworzonego za pomocą #define to plik, w którym zdefiniowano symbol.

Sugerowałoby to, że możesz lepiej skorzystać z refleksji. Być może możesz użyć klasy Attribute, aby udekorować rozszerzenia i podać informacje o czasie wykonywania, które możesz przetestować.

+0

Możliwe jest ustawienie symboli za pomocą ustawień projektu (warunkowe symbole kompilacji). – SlapY