Guid в Enum!
От: FreddieM  
Дата: 19.12.06 11:30
Оценка:
Сабж! Неоходимо чтобы поля enum'а ассоциировались с Guid'ом, а не с int, long, byte и т.п. Вроде как это не возможно, но может есть какие-либо альтернативные варианты?
Re: Guid в Enum!
От: pt4h Беларусь http://dzmitryhuba.blogspot.com/
Дата: 19.12.06 11:35
Оценка:
Здравствуйте, FreddieM, Вы писали:

FM>Сабж! Неоходимо чтобы поля enum'а ассоциировались с Guid'ом, а не с int, long, byte и т.п. Вроде как это не возможно, но может есть какие-либо альтернативные варианты?


Написать обертку.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Guid в Enum!
От: Oyster Украина https://github.com/devoyster
Дата: 19.12.06 11:46
Оценка: +2
Здравствуйте, FreddieM, Вы писали:

FM>Сабж! Неоходимо чтобы поля enum'а ассоциировались с Guid'ом, а не с int, long, byte и т.п. Вроде как это не возможно, но может есть какие-либо альтернативные варианты?


Навесить атрибут с GUID-ом в строковой форме на элементы enum-а и пользовать при помощи reflection.
Re: Guid в Enum!
От: Murom Россия  
Дата: 19.12.06 12:17
Оценка: +2
Здравствуйте, FreddieM, Вы писали:

FM>Сабж! Неоходимо чтобы поля enum'а ассоциировались с Guid'ом, а не с int, long, byte и т.п. Вроде как это не возможно, но может есть какие-либо альтернативные варианты?


По-моему само собой напрашивается map (ну или dictionary).
- Eugeny
Re[2]: Guid в Enum!
От: Константин Л. Франция  
Дата: 19.12.06 13:35
Оценка:
Здравствуйте, Oyster, Вы писали:

O>Здравствуйте, FreddieM, Вы писали:


FM>>Сабж! Неоходимо чтобы поля enum'а ассоциировались с Guid'ом, а не с int, long, byte и т.п. Вроде как это не возможно, но может есть какие-либо альтернативные варианты?


O>Навесить атрибут с GUID-ом в строковой форме на элементы enum-а и пользовать при помощи reflection.


System.Runtime.InteropServices.GuidAttribute
Re[3]: Guid в Enum!
От: Oyster Украина https://github.com/devoyster
Дата: 19.12.06 14:00
Оценка: +1
Здравствуйте, Константин Л., Вы писали:

КЛ>System.Runtime.InteropServices.GuidAttribute


Не пойдёт. Смотрим на его AttributeUsageAttribute (из MSDN):

[AttributeUsageAttribute(
    AttributeTargets.Assembly |
    AttributeTargets.Class |
    AttributeTargets.Struct |
    AttributeTargets.Enum |
    AttributeTargets.Interface |
    AttributeTargets.Delegate
)]

А нам надо AttributeTargets.Field.
Re[4]: Guid в Enum!
От: Константин Л. Франция  
Дата: 19.12.06 14:03
Оценка:
Здравствуйте, Oyster, Вы писали:

O>Здравствуйте, Константин Л., Вы писали:


КЛ>>System.Runtime.InteropServices.GuidAttribute


O>Не пойдёт. Смотрим на его AttributeUsageAttribute (из MSDN):


O>
O>[AttributeUsageAttribute(
O>    AttributeTargets.Assembly |
O>    AttributeTargets.Class |
O>    AttributeTargets.Struct |
O>    AttributeTargets.Enum |
O>    AttributeTargets.Interface |
O>    AttributeTargets.Delegate
O>)]
O>

O>А нам надо AttributeTargets.Field.

угу
Re[2]: Guid в Enum!
От: _FRED_ Черногория
Дата: 19.12.06 14:30
Оценка: 2 (1)
Здравствуйте, Murom, Вы писали:

FM>>Сабж! Неоходимо чтобы поля enum'а ассоциировались с Guid'ом, а не с int, long, byte и т.п. Вроде как это не возможно, но может есть какие-либо альтернативные варианты?


M>По-моему само собой напрашивается map (ну или dictionary).


А ещё лучше — массив
namespace ConsoleApplication1
{
  using System;

  enum GuidValue
  {
    Aaa,
    Bbb,
    Ccc,
    Ddd,
  }

  class GuidValues
  {
    private static readonly Guid[] Items = new Guid[] { 
      new Guid("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"),
      new Guid("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"),
      new Guid("cccccccc-cccc-cccc-cccc-cccccccccccc"),
      new Guid("dddddddd-dddd-dddd-dddd-dddddddddddd"),
    };

    private static readonly GuidValues instance = new GuidValues();

    public Guid this[GuidValue index] {
      get { return Items[(int)index]; }
    }

    public static GuidValues Instance {
      get { return instance; }
    }
  }

  class Program
  {
    static void Main(string[] args) {
      GuidValue v = GuidValue.Bbb;
      Guid g = GuidValues.Instance[v];
    }
  }
}
... << RSDN@Home 1.2.0 alpha rev. 665>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Guid в Enum!
От: FreddieM  
Дата: 19.12.06 14:52
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Murom, Вы писали:


FM>>>Сабж! Неоходимо чтобы поля enum'а ассоциировались с Guid'ом, а не с int, long, byte и т.п. Вроде как это не возможно, но может есть какие-либо альтернативные варианты?


M>>По-моему само собой напрашивается map (ну или dictionary).


_FR>А ещё лучше — массив

_FR>
_FR>namespace ConsoleApplication1
_FR>{
_FR>  using System;

_FR>  enum GuidValue
_FR>  {
_FR>    Aaa,
_FR>    Bbb,
_FR>    Ccc,
_FR>    Ddd,
_FR>  }

_FR>  class GuidValues
_FR>  {
_FR>    private static readonly Guid[] Items = new Guid[] { 
_FR>      new Guid("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"),
_FR>      new Guid("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"),
_FR>      new Guid("cccccccc-cccc-cccc-cccc-cccccccccccc"),
_FR>      new Guid("dddddddd-dddd-dddd-dddd-dddddddddddd"),
_FR>    };

_FR>    private static readonly GuidValues instance = new GuidValues();

_FR>    public Guid this[GuidValue index] {
_FR>      get { return Items[(int)index]; }
_FR>    }

_FR>    public static GuidValues Instance {
_FR>      get { return instance; }
_FR>    }
_FR>  }

_FR>  class Program
_FR>  {
_FR>    static void Main(string[] args) {
_FR>      GuidValue v = GuidValue.Bbb;
_FR>      Guid g = GuidValues.Instance[v];
_FR>    }
_FR>  }
_FR>}
_FR>


Большое спасибо, пока наверное так и будет... Но мне очень понравился вариант с рефлекшн:

Собственно, есть такой код:

FieldInfo field = typeof(UserType).GetField("Admin");
UserTypeGuidAttribute atribute = field.GetCustomAttributes(typeof(UserTypeGuidAttribute), false)[0] as UserTypeGuidAttribute;


где, UserType — enum, а UserTypeGuidAttribute — созданный мной атрибут.

Возможно ли получить атрибут поля без GetField("Admin"), тобишь без названия поля в строке — не хочется хардкодить...
Re[4]: Guid в Enum!
От: _FRED_ Черногория
Дата: 19.12.06 15:05
Оценка:
Здравствуйте, FreddieM, Вы писали:

FM>…понравился вариант с рефлекшн:

FM>Собственно, есть такой код:
FM>FieldInfo field = typeof(UserType).GetField("Admin");
  // Вместо as здесь надо использовать приведение типов.
FM>UserTypeGuidAttribute atribute = (UserTypeGuidAttribute)field.GetCustomAttributes(typeof(UserTypeGuidAttribute), false)[0];

FM>где, UserType — enum, а UserTypeGuidAttribute — созданный мной атрибут.

FM>Возможно ли получить атрибут поля без GetField("Admin"), тобишь без названия поля в строке — не хочется хардкодить...


Во-первых, нет, нельзя "получить атрибут поля" без указания в строке имени поля,

хотя с енумом и пройдёт:
FieldInfo field = typeof(UserType).GetField(Enum.GetName(typeof(UserType), UserType.Admin));

но не в случае
enum Test {
  Aaa = 1,
  Bbb = 1,
}


во-вторых, используемый тут Reflection многие ругают за недопустимую часто медленность.
... << RSDN@Home 1.2.0 alpha rev. 665>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Guid в Enum!
От: Tiarod Украина  
Дата: 19.12.06 15:05
Оценка: 2 (1)
Здравствуйте, FreddieM, Вы писали:

FM>Собственно, есть такой код:


FM>
FM>FieldInfo field = typeof(UserType).GetField("Admin");
FM>UserTypeGuidAttribute atribute = field.GetCustomAttributes(typeof(UserTypeGuidAttribute), false)[0] as UserTypeGuidAttribute;
FM>


FM>где, UserType — enum, а UserTypeGuidAttribute — созданный мной атрибут.


FM>Возможно ли получить атрибут поля без GetField("Admin"), тобишь без названия поля в строке — не хочется хардкодить...


Вот так все работает без хардкодинга:
enum DataEnum
{
    [Description("Aaa")]
    Aaa,
    [Description("Bbb")]
    Bbb,
    [Description("Ccc")]
    Ccc
}

DataEnum data = DataEnum.Bbb;
//Assert.AreEqual<string>("Bbb", data.ToString());
FieldInfo fi = data.GetType().GetField(data.ToString());
//Assert.IsNotNull(fi);
object[] attributes = fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
//Assert.IsTrue(attributes.Length == 1);
DescriptionAttribute description = (DescriptionAttribute)attributes[0];
//Assert.AreEqual<string>("Bbb", description.Description);
Re[5]: Guid в Enum!
От: Oyster Украина https://github.com/devoyster
Дата: 19.12.06 15:32
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>во-вторых, используемый тут Reflection многие ругают за недопустимую часто медленность.


Естественно, reflection дёргать каждый раз не дело. Я предполагал как раз заполнять хеш-таблицу (массив не всегда сработает — например, он не сработает, если значения полей enum-а сильно разрежены) значениями из атрибутов, а потом использовать уже заполеннную таблицу.
Re[6]: Guid в Enum!
От: _FRED_ Черногория
Дата: 19.12.06 15:36
Оценка:
Здравствуйте, Oyster, Вы писали:

_FR>>во-вторых, используемый тут Reflection многие ругают за недопустимую часто медленность.


O>Естественно, reflection дёргать каждый раз не дело. Я предполагал как раз заполнять хеш-таблицу (массив не всегда сработает — например, он не сработает, если значения полей enum-а сильно разрежены) значениями из атрибутов, а потом использовать уже заполеннную таблицу.


Тогда зачем вообще отражение\аттрибуты, если информация, получаемая через них извесна на момент компиляции
... << RSDN@Home 1.2.0 alpha rev. 665>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re[7]: Guid в Enum!
От: Oyster Украина https://github.com/devoyster
Дата: 19.12.06 15:43
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Тогда зачем вообще отражение\аттрибуты, если информация, получаемая через них извесна на момент компиляции


Для удобства — для чего же ещё?
Re[8]: Guid в Enum!
От: FreddieM  
Дата: 19.12.06 19:31
Оценка:
Всем спасибо! Что буду использовать, пока не знаю... Хочется заюзать атрибуты и рефлекшн — очень красиво, но производительность... Массив, наверное, более подходит.
Re: Guid в Enum!
От: IT Россия linq2db.com
Дата: 19.12.06 20:18
Оценка: 104 (4)
Здравствуйте, FreddieM, Вы писали:

FM>Сабж! Неоходимо чтобы поля enum'а ассоциировались с Guid'ом, а не с int, long, byte и т.п. Вроде как это не возможно, но может есть какие-либо альтернативные варианты?


Вариант с атрибутами на BLToolkit:

using BLToolkit.Mapping;

public class MapGuidAttribute : MapValueAttribute
{
    public MapGuidAttribute(string guid) : base(new Guid(guid))
    {
    }
}

public enum MyEnum
{
    [MapGuid("6463EF57-067B-4c8e-83A3-4A252B21DC07")] Guid1,
    [MapGuid("6463EF57-067B-5c8e-83A3-4A252B21DC07")] Guid2
}

void Test()
{
    Guid g = (Guid)Map.EnumToValue(MyEnum.Guid1);
}

Дарю
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Guid в Enum!
От: rameel https://github.com/rsdn/CodeJam
Дата: 19.12.06 20:30
Оценка:
Здравствуйте, IT, Вы писали:

Круто! Красиво, лаконично и юзабельно! Жаль, что оценку больше не могу выставить
... << RSDN@Home 1.2.0 alpha rev. 669>>
Re[9]: Guid в Enum!
От: Воронков Василий Россия  
Дата: 21.07.09 12:04
Оценка:
Здравствуйте, FreddieM, Вы писали:

FM>Всем спасибо! Что буду использовать, пока не знаю... Хочется заюзать атрибуты и рефлекшн — очень красиво, но производительность... Массив, наверное, более подходит.


А ты закэшируй. При первом обращении получаешь список всех полей энума и их атрибуты, и на основе этого составляешь тот же словарик или массив, и потом все летает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.