Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как преобразовать Type в Enum? / 8 сообщений из 8, страница 1 из 1
29.03.2010, 08:36
    #36547426
Limonad
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать Type в Enum?
Здравствуйте!
Подскажите, как преобразовать Type в Enum. Следующий код вызывает ошибку:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
using System;
using System.Reflection;
using System.ComponentModel;

enum ColorFirst
{ 
    [DescriptionAttribute("красный")]
    Red, 
    [DescriptionAttribute("зелёный")]
    Green, 
    [DescriptionAttribute("синий")]
    Blue 
}

enum ColorSecond
{ 
    [DescriptionAttribute("Жёлтый")]
    Yellow, 
    [DescriptionAttribute("белый")]
    White, 
    [DescriptionAttribute("чёрный")]
    Black 
}
public static class EnumUtils
{
    public static string GetString(this Enum e)
    {
        var s = e.ToString();
        var fi = e.GetType().GetField(s);
        var attributes = (DescriptionAttribute[]) fi.GetCustomAttributes(
            typeof(DescriptionAttribute), false);
        if (attributes.Length > 0)
            s =  attributes[0].Description;
        return s;
    }
}

public static class Program
{
    public static void Main(string[] args)
    {
         Console.WriteLine("EnumValues: {0}", ord, GetEnumValues("ColorFirst"));
    }

    public string GetEnumValues(string enumName)
    {
	string enumValueList=string.Empty;
	Type enumType = Type.GetType(enumName); 
	foreach (int ord in Enum.GetValues(enumType))
        {
		enumValueList+=" "+((enumType) ord).GetString()
	}

    }
}

Возможно ли вообще такое?
...
Рейтинг: 0 / 0
29.03.2010, 10:00
    #36547503
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать Type в Enum?
Возможно, главное чуточку желания :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
// Получить описание из перечисления
string desc = ColorFirst.Blue.ToDescription();

// Получить перечисление из описания
ColorFirst fst = desc.ToEnum<ColorFirst>();

// Список описаний через разделитель " "
string enumValueList = Enum.GetValues(typeof(ColorFirst)).Cast<ColorFirst>().Select(d => d.ToDescription()).Aggregate((a, b) => a + " " + b);

EnumExtensions
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
/// <summary>
/// Расширяющие методы перечислений
/// </summary>
public static class EnumExtensions
{
    /// <summary>
    /// Преобразование перечисления в текстовое описание
    /// </summary>
    /// <param name="value"></param>
    /// <returns>Возвращает текстовое описание поля перечисления</returns>
    public static string ToDescription(this Enum value)
    {
        var da = (DescriptionAttribute[])(value.GetType().GetField(value.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), false));
        return da.Length > 0 ? da[0].Description : value.ToString();
    }

    /// <summary>
    /// Преобразование текстового описания в перечисление
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value"></param>
    /// <returns>Возвращает поле перечисления</returns>
    public static T ToEnum<T>(this string value)
    {
        foreach (T enumValue in Enum.GetValues(typeof(T)))
        {
            DescriptionAttribute[] da = (DescriptionAttribute[])(typeof(T).GetField(enumValue.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), false));
            if (da.Length > 0 && da[0].Description == value)
            {
                return enumValue;
            }
        }
        return default(T);
    }
}
...
Рейтинг: 0 / 0
29.03.2010, 11:37
    #36547754
Limonad
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать Type в Enum?
МСУ,

Может я не до конца понял.
На входе строка (название Enum'a), её я преобразую в Type, через Type мне нужно получить все возможные значения Enum'a.

Приведённый выше пример вроде не позволяет этого сделать.
...
Рейтинг: 0 / 0
29.03.2010, 11:46
    #36547772
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать Type в Enum?
LimonadПриведённый выше пример вроде не позволяет этого сделать.
А если подумать?

Код: plaintext
Array values = Enum.GetValues("зелёный".ToEnum<ColorFirst>().GetType());
...
Рейтинг: 0 / 0
29.03.2010, 11:51
    #36547781
Limonad
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать Type в Enum?
МСУLimonadПриведённый выше пример вроде не позволяет этого сделать.
А если подумать?

Код: plaintext
Array values = Enum.GetValues("зелёный".ToEnum<ColorFirst>().GetType());


в моём случае я не знаю, что
ToEnum<ColorFirst>

не знаю, что ColorFirst
...
Рейтинг: 0 / 0
29.03.2010, 11:55
    #36547789
зы
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать Type в Enum?
Данила, опять ты со своим линком в бочке затычка. У автора же в тесте к задаче имя типа строкой задается, а ты кастишь к заранее указанному типу.


Автор, поменяй пару букв в своем цикле и все заработает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
		public static string GetEnumValues(string enumName)
		{
			string enumValueList = string.Empty;
			Type enumType = Type.GetType(enumName, true, true);
			foreach (object ord in Enum.GetValues(enumType))
			{
				enumValueList += " " + ((Enum)ord).GetString();
			}
			return enumValueList;
		}
...
Рейтинг: 0 / 0
29.03.2010, 12:06
    #36547809
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать Type в Enum?
зыДанила, опять ты со своим линком в бочке затычка. У автора же в тесте к задаче имя типа строкой задается, а ты кастишь к заранее указанному типу.
Линк тут не при чем, зыня, афтар просто криво объясняет:

автор На входе строка (название Enum'a) , её я преобразую в Type, через Type мне нужно получить все возможные значения Enum'a.
Я так понял, что он имел ввиду строку (атрибут). То есть, имея тестовый атрибут, распарсить в енум, ну и дальше по задаче.

Limonadв моём случае я не знаю, что
ToEnum<ColorFirst>

не знаю, что ColorFirst

Дык, в чём проблема-то

Код: plaintext
Array values = Enum.GetValues(Type.GetType("MySpace.ColorFirst"));

?

P.S. А проблема вся походу кроется в том, что автор неймспейс забыл указать в хардкоде
...
Рейтинг: 0 / 0
29.03.2010, 20:41
    #36549174
Limonad
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать Type в Enum?
МСУ,

Спасибо, всем!!!
неправильно указывал, путь до сборки ((((
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как преобразовать Type в Enum? / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]