2011-03-24 89 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