2011-03-24 28 views
3

我正在做一些互操作,需要传递一些GUID。有没有办法将一个GUID属性添加到一个枚举值,当它编组时,它有适当的值?GUID/Guid互操作的枚举

基本上我想要的代码

#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 

(和其他几个类似的)

转换,并利用它们在一个枚举,所以我可以很容易地指定相应的亚型格式。显然,我可能只是使用字典或其他类似的方法,但我希望尽可能透明。

这将是很好做类似

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

我可以用一个类/结构,而不是

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

但这里唯一的问题是有没有办法涉及在非托管的GUID结构到这个类。它被指定为Guid,如果我用MyGuids替换它,那么它将不再是Guid。例如,我失去了类型安全性,因为任何指导都可能在现场出现,而不仅仅是来自MyGuid的指导。

任何想法?

回答

1

Guid是.NET中的结构,它们太大而无法以简单的值类型放大一倍。听起来你需要初始化结构成员。这将需要您的代码中的赋值语句。 const会为此工作得很好。否则无法让编译器自动执行。

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

我不认为你明白这个问题。这不是一个分配问题,而是一个价值限制问题。枚举是有用的,因为它们限制可赋值并具有有意义的表示。我正在寻找相同的。使用静态类/结构获取有意义的表示,但不限制可分配的值。这导致使用错误值的可能性。这不是什么大问题,但应该可以做到这一点......当然,只是MS忘记实施的另一件事情。 – AbstractDissonance 2011-03-25 01:47:51

+2

在枚举中填充GUID不会发生,一个128位的猪不适合64位的捅。这是不正确的地方讨论什么MSFT应该做或忘记,发布功能请求connect.microsoft.com – 2011-03-25 02:02:12

+1

嗯,不,但并不意味着有没有办法使用反射和元数据来潜在地解决问题。无论如何,我看到我们不会在这里得到解决方案。 – AbstractDissonance 2011-03-25 14:49:27