我正在做一些互操作,需要传递一些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的那些。
有什么想法吗?
答案 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();
}
}
}