Перечень GUID's / Guid interop - PullRequest
3 голосов
/ 24 марта 2011

Я делаю какое-то взаимодействие и мне нужно передать несколько 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.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 24 марта 2011

Направляющие - это структуры в .NET, они слишком велики, чтобы вписываться в простой тип значения в два раза Мне кажется, что вам нужен инициализированный элемент структуры. Для этого потребуется код присваивания в вашем коде. Const будет отлично работать для этого. Иначе нет способа заставить компилятор делать это автоматически.

  var sound = new foo();
  sound.waveFormat = MyGuids.flag1;
  // etc..
0 голосов
/ 16 января 2019

Как насчет этого?

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();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...