2011-03-24 5 views
3

Je fais un peu d'interopérabilité et j'ai besoin de passer des GUID. Est-il possible d'ajouter un attribut GUID à une valeur enum et quand il est marshalled il a la valeur appropriée?Énumération de GUID/Guid interop

Fondamentalement, je suis en train de convertir le code

#if !defined(STATIC_KSDATAFORMAT_SUBTYPE_PCM) 
#define STATIC_KSDATAFORMAT_SUBTYPE_PCM\ 
    DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_PCM) 
DEFINE_GUIDSTRUCT("00000001-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_PCM); 
#define KSDATAFORMAT_SUBTYPE_PCM DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_PCM) 
#endif 

(et plusieurs autres semblables)

et de les utiliser dans un ENUM pour que je puisse facilement spécifier le format de sous-type approprié. Évidemment, je pourrais probablement utiliser un dictionnaire ou une autre méthode similaire, mais je voudrais le rendre aussi transparent que possible.

Ce serait bien de faire quelque chose comme

enum MyGuids : Guid 
{ 
    Guid1 = GUID("...") or just "..." 
} 

Je peux utiliser une classe/struct au lieu

static class MyGuids 
{ 
    public static Guid flag1 = new Guid("9ED54F84-A89D-4fcd-A854-44251E925F09"); 
} 

Mais le seul problème ici est qu'il n'y a aucun moyen de relier le guid non géré structure à cette classe. C'est spécifié comme Guid et si je l'ai remplacé avec MyGuids alors ce ne sera plus un Guid. par exemple, je perds la sécurité de type car tout guid peut se retrouver sur le terrain et pas seulement ceux de MyGuid.

Des idées?

Répondre

1

Les guids sont des structures en .NET, elles sont trop grandes pour tenir dans un type de valeur simple par un facteur de deux. Il me semble que vous avez besoin d'un membre de structure initialisé. Cela va avoir besoin d'une déclaration d'affectation dans votre code. Le const fonctionnera très bien pour cela. Il n'y a autrement aucun moyen d'obtenir le compilateur pour le faire automatiquement.

var sound = new foo(); 
    sound.waveFormat = MyGuids.flag1; 
    // etc.. 
+1

Je ne pense pas que vous compreniez le problème. Ce n'est pas un problème d'affectation mais un problème de restriction de valeur. Les énumérations sont utiles car elles limitent les valeurs assignables et ont une représentation significative. Je cherche la même chose. L'utilisation d'une classe/struct statique obtient la représentation significative mais ne restreint pas les valeurs assignables. Cela conduit à la possibilité d'utiliser les mauvaises valeurs. Ce n'est pas une affaire énorme mais on devrait être en mesure de le faire ... bien sûr, juste une autre chose que MS a oublié de mettre en œuvre. – AbstractDissonance

+2

Le remplissage d'un guid dans une énumération ne va pas arriver, un cochon de 128 bits ne rentre pas dans un poke de 64 bits. Ce n'est pas le bon endroit pour discuter de ce que MSFT devrait faire ou oublier, publier des demandes de fonctionnalités pour connecter.microsoft.com –

+1

um, non mais cela ne signifie pas qu'il n'y a pas moyen d'utiliser la réflexion et les métadonnées pour potentiellement résoudre le problème. problème. En tout cas, je vois que nous n'allons pas trouver de solution ici. – AbstractDissonance