GUID的枚举/GUID互操作

3

我正在进行一些互操作,并需要传递一些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个回答

1

Guids是.NET中的结构,它们比简单值类型大两倍。听起来你需要初始化一个结构成员。这将需要在你的代码中使用赋值语句。对于这个问题,const将完美地解决。否则,没有办法让编译器自动完成。

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

2
我觉得你不理解问题所在。这不是一个分配问题,而是一个值限制问题。枚举很有用,因为它们限制了可分配的值并具有有意义的表示。我正在寻找同样的功能。使用静态类/结构可以获得有意义的表示,但不能限制可分配的值。这会导致使用错误的值的可能性。这不是一个大问题,但人们应该能够做到...当然,这又是微软忘记实现的另一件事情。 - AbstractDissonance
2
将 GUID 填充到枚举中是不可能的,128 位的大块无法塞入 64 位的小坑。这里不适合讨论 MSFT 应该做什么或忘记了什么,请在 connect.microsoft.com 上发布功能请求。 - Hans Passant
1
嗯,不过这并不意味着没有办法使用反射和元数据来潜在地解决问题。无论如何,我看我们在这里得不到解决方案。 - AbstractDissonance

1
这样的东西怎么样?
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();
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接