GUID / Guid互操作的枚举

时间:2011-03-24 18:28:19

标签: c# interop

我正在做一些互操作,需要传递一些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。例如,我失去了类型安全性,因为任何guid都可以在现场结束,而不仅仅是来自MyGuid的那些。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

Guids是.NET中的结构,它们太大而不适合简单的值类型两倍。听我说你需要初始化一个结构成员。这将需要您的代码中的赋值语句。 const将适用于此。否则无法让编译器自动执行此操作。

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

答案 1 :(得分:0)

这样的事情怎么样?

void Main()
{
    var dog = MyValues.Dog.ToId();  
    var cat = MyValues.Cat.ToId();  
    var bird = MyValues.Bird.ToId();    
}

public enum MyValues
{ 
    Dog,
    Cat,
    Bird
}

public static class Functions
{
    public static Guid ToId(this MyValues value)
    {
        switch (value)
        {
            case MyValues.Dog:
                return Guid.Parse("6d139d6a-2bfa-466d-a9a5-c6e82f9abf51");
            case MyValues.Cat:
                return Guid.Parse("AA139d6a-2bfa-466d-a9a5-c6e82f9abf51");
            case MyValues.Bird:
                return Guid.Parse("BB139d6a-2bfa-466d-a9a5-c6e82f9abf51");
            default:
                throw new InvalidDataException();
        }
    }
}