Как преобразовать из Системы. Перечисление для базирования целого числа?

Чтобы использовать решение @ Matthias Robbers напрямую из XML, вы можете сделать следующее: создать 2 файла:

1- pulse.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromXScale="1"
        android:fromYScale="1"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="0.8"
        android:toYScale="0.8"
        android:duration="500"
        android:repeatCount="infinite"
        android:repeatMode="reverse"/>
</set>

2- pulse_layout_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
    android:animation="@anim/pulse">
</layoutAnimation>

, затем в своем XML-файле макета просто добавьте эту анимацию в любой необходимый вам просмотр, например:

<ImageView
    android:layout_width="55dp"
    android:layout_height="55dp"
    android:src="@drawable/heart"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:layoutAnimation="@anim/pulse_layout_animation" />
88
задан orj 27 May 2009 в 00:59
поделиться

5 ответов

Если вы не хотите использовать заклинание,

Convert.ToInt32()

может помочь.

Прямое приведение (через (int) enumValue ) невозможно. Обратите внимание, что это также было бы «опасно», поскольку перечисление может иметь разные базовые типы ( int , long , byte ...).

Более формально: System.Enum не имеет прямого отношения наследования с Int32 (хотя оба имеют ValueType s), поэтому явное приведение не может быть правильным внутри система типов

131
ответ дан 24 November 2019 в 07:30
поделиться

Я заставил его работать, приведя его к объекту, а затем к int:

public static class EnumExtensions
{
    public static int ToInt(this Enum enumValue)
    {
        return (int)((object)enumValue);
    }
}

Это уродливый и, вероятно, не лучший способ. Я буду продолжать возиться с этим, чтобы посмотреть, смогу ли я придумать что-нибудь получше ....

РЕДАКТИРОВАТЬ: Я как раз собирался опубликовать, что Convert.ToInt32 (enumValue) также работает, и заметил, что Мартин Стеттнер победил меня до это.

public static class EnumExtensions
{
    public static int ToInt(this Enum enumValue)
    {
        return Convert.ToInt32(enumValue);
    }
}

Тест:

int x = DayOfWeek.Friday.ToInt();
Console.WriteLine(x); // results in 5 which is int value of Friday

РЕДАКТИРОВАТЬ 2: В комментариях кто-то сказал, что это работает только в C # 3.0. Я только что протестировал это в VS2005 вот так, и это сработало:

public static class Helpers
{
    public static int ToInt(Enum enumValue)
    {
        return Convert.ToInt32(enumValue);
    }
}

    static void Main(string[] args)
    {
        Console.WriteLine(Helpers.ToInt(DayOfWeek.Friday));
    }
38
ответ дан 24 November 2019 в 07:30
поделиться

Приведение из System.Enum в int у меня отлично работает (это также на MSDN ). Возможно, это ошибка Resharper.

1
ответ дан 24 November 2019 в 07:30
поделиться

Почему вам нужно изобретать велосипед с помощью вспомогательного метода? Совершенно законно привести значение enum к его базовому типу.

Это менее типично и, на мой взгляд, более читабельно, чтобы использовать ...

int x = (int)DayOfWeek.Tuesday;

... вместо чего-то вроде .. .

int y = Converter.ToInteger(DayOfWeek.Tuesday);
// or
int z = DayOfWeek.Tuesday.ToInteger();
10
ответ дан 24 November 2019 в 07:30
поделиться

Не забывайте, что у самого типа Enum есть набор статических вспомогательных функций. Если все, что вы хотите сделать, это преобразовать экземпляр перечисления в соответствующий ему целочисленный тип, то приведение, вероятно, является наиболее эффективным способом.

Я думаю, что ReSharper жалуется, потому что Enum не является перечислением какого-либо конкретного типа, а перечисления сами являются производными от типа скалярного значения, а не от Enum. Если вам нужно универсальное адаптируемое приведение, я бы сказал, что это может вам подойти (обратите внимание, что сам тип перечисления также включен в общий:

public static EnumHelpers
{
    public static T Convert<T, E>(E enumValue)
    {
        return (T)enumValue;
    }
}

Это может быть использовано следующим образом:

public enum StopLight: int
{
    Red = 1,
    Yellow = 2,
    Green = 3
}

// ...

int myStoplightColor = EnumHelpers.Convert<int, StopLight>(StopLight.Red);

Я не могу скажем наверняка из головы, но приведенный выше код может даже поддерживаться выводом типа C #, позволяя следующее:

int myStoplightColor = EnumHelpers.Convert<int>(StopLight.Red);
-1
ответ дан 24 November 2019 в 07:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: