Сабж! Неоходимо чтобы поля enum'а ассоциировались с Guid'ом, а не с int, long, byte и т.п. Вроде как это не возможно, но может есть какие-либо альтернативные варианты?
Здравствуйте, FreddieM, Вы писали:
FM>Сабж! Неоходимо чтобы поля enum'а ассоциировались с Guid'ом, а не с int, long, byte и т.п. Вроде как это не возможно, но может есть какие-либо альтернативные варианты?
Здравствуйте, FreddieM, Вы писали:
FM>Сабж! Неоходимо чтобы поля enum'а ассоциировались с Guid'ом, а не с int, long, byte и т.п. Вроде как это не возможно, но может есть какие-либо альтернативные варианты?
Навесить атрибут с GUID-ом в строковой форме на элементы enum-а и пользовать при помощи reflection.
Здравствуйте, FreddieM, Вы писали:
FM>Сабж! Неоходимо чтобы поля enum'а ассоциировались с Guid'ом, а не с int, long, byte и т.п. Вроде как это не возможно, но может есть какие-либо альтернативные варианты?
По-моему само собой напрашивается map (ну или dictionary).
Здравствуйте, Oyster, Вы писали:
O>Здравствуйте, FreddieM, Вы писали:
FM>>Сабж! Неоходимо чтобы поля enum'а ассоциировались с Guid'ом, а не с int, long, byte и т.п. Вроде как это не возможно, но может есть какие-либо альтернативные варианты?
O>Навесить атрибут с GUID-ом в строковой форме на элементы enum-а и пользовать при помощи reflection.
Здравствуйте, Oyster, Вы писали:
O>Здравствуйте, Константин Л., Вы писали:
КЛ>>System.Runtime.InteropServices.GuidAttribute
O>Не пойдёт. Смотрим на его AttributeUsageAttribute (из MSDN):
O>
Здравствуйте, 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.
Здравствуйте, _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"), тобишь без названия поля в строке — не хочется хардкодить...
Здравствуйте, 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.
Здравствуйте, 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"), тобишь без названия поля в строке — не хочется хардкодить...
Здравствуйте, _FRED_, Вы писали:
_FR>во-вторых, используемый тут Reflection многие ругают за недопустимую часто медленность.
Естественно, reflection дёргать каждый раз не дело. Я предполагал как раз заполнять хеш-таблицу (массив не всегда сработает — например, он не сработает, если значения полей enum-а сильно разрежены) значениями из атрибутов, а потом использовать уже заполеннную таблицу.
Здравствуйте, 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.
Всем спасибо! Что буду использовать, пока не знаю... Хочется заюзать атрибуты и рефлекшн — очень красиво, но производительность... Массив, наверное, более подходит.
Здравствуйте, 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);
}
Дарю
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, FreddieM, Вы писали:
FM>Всем спасибо! Что буду использовать, пока не знаю... Хочется заюзать атрибуты и рефлекшн — очень красиво, но производительность... Массив, наверное, более подходит.
А ты закэшируй. При первом обращении получаешь список всех полей энума и их атрибуты, и на основе этого составляешь тот же словарик или массив, и потом все летает.