Перечислимый ToString с удобными для пользователя строками

Прежде всего, какие-либо сообщения об ошибках в инструменте проверки браузера? Установили ли вы гем jquery-rails, если нет, перейдите по ссылке ниже и установите его.

https://rubygems.org/gems/jquery-rails/versions/4.3.1

Во-вторых, это может быть из-за того, что. live() устарела и согласно версия 1.9 полностью удалена.

Попробуйте вместо этого использовать обработчик событий .on().

В-третьих, это очень много кода, граничащего с небольшим количеством спагетти-кода для чего-то действительно простого. Что бы я сделал, чтобы упростить его:

    $(".message").on("keyup", function () {
        var maxlength = $(this).attr("maxlength")
        var remaining = $(this).val().length
        $(this).next().text(remaining + '/' + maxLengh)
    })

Нет необходимости заключать его в $ (document) .ready (), слишком много $ (document) .ready () замедлит время загрузки. (увеличивая время написания скриптов) при обновлении приложения. В зависимости от того, как вы настроили ваше приложение rails для выполнения javascript, вы можете обернуть все ваши javascript / jquery в один большой $ (document) .ready (), который будет выполнять один раз при Обновление приложения.

Кроме того, .on () - это прослушиватель событий, который прослушивает и ждет, когда что-то произойдет, например .on ("keyup", function (). Вы можете отключить прослушиватель событий, используя $(".message").off()

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

264
задан Boris Callens 23 November 2014 в 23:15
поделиться

7 ответов

Я использую Description атрибут от Системы. Пространство имен ComponentModel. Просто украсьте перечисление:

private enum PublishStatusValue
{
    [Description("Not Completed")]
    NotCompleted,
    Completed,
    Error
};

Затем используют этот код для получения его:

public static string GetDescription<T>(this T enumerationValue)
    where T : struct
{
    Type type = enumerationValue.GetType();
    if (!type.IsEnum)
    {
        throw new ArgumentException("EnumerationValue must be of Enum type", "enumerationValue");
    }

    //Tries to find a DescriptionAttribute for a potential friendly name
    //for the enum
    MemberInfo[] memberInfo = type.GetMember(enumerationValue.ToString());
    if (memberInfo != null && memberInfo.Length > 0)
    {
        object[] attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

        if (attrs != null && attrs.Length > 0)
        {
            //Pull out the description value
            return ((DescriptionAttribute)attrs[0]).Description;
        }
    }
    //If we have no description attribute, just return the ToString of the enum
    return enumerationValue.ToString();
}
337
ответ дан Uwe Keim 23 November 2019 в 02:28
поделиться

Если Вы хотите что-то абсолютно настраиваемое, испытываете мое решение здесь:

http://www.kevinwilliampang.com/post/Mapping-Enums-To-Strings-and-Strings-to-Enums-in-NET.aspx

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

-3
ответ дан Kevin Pang 23 November 2019 в 02:28
поделиться

То, что другое сообщение является Java. Вы не можете поместить методы в Перечисления в C#.

просто делают что-то вроде этого:

PublishStatusses status = ...
String s = status.ToString();

, Если Вы хотите использовать различные значения дисплея для своих перечислимых значений, Вы могли бы использовать Атрибуты и Отражение.

12
ответ дан Lemmy 23 November 2019 в 02:28
поделиться

Самое легкое решение здесь состоит в том, чтобы использовать пользовательский дополнительный метод (в.NET 3.5, по крайней мере - можно просто преобразовать его в статический вспомогательный метод для более ранних версий платформы).

public static string ToCustomString(this PublishStatusses value)
{
    switch(value)
    {
        // Return string depending on value.
    }
    return null;
}

я предполагаю здесь, что Вы хотите возвратить что-то другое, чем подлинное имя перечисления значений (который можно получить путем простого вызова ToString).

17
ответ дан Noldorin 23 November 2019 в 02:28
поделиться

Возможно, я пропускаю что-то, но что случилось с Перечислением. GetName?

public string GetName(PublishStatusses value)
{
    return Enum.GetName(typeof(PublishStatusses), value)
}

редактирование: для удобных для пользователя строк необходимо пройти .resource, чтобы сделать интернационализацию/локализацию, и возможно было бы лучше использовать фиксированный ключ на основе перечислимого ключа, чем атрибут декоратора на том же.

69
ответ дан AustinWBryan 23 November 2019 в 02:28
поделиться

Я делаю это с дополнительными методами:

public enum ErrorLevel
{
  None,
  Low,
  High,
  SoylentGreen
}

public static class ErrorLevelExtensions
{
  public static string ToFriendlyString(this ErrorLevel me)
  {
    switch(me)
    {
      case ErrorLevel.None:
        return "Everything is OK";
      case ErrorLevel.Low:
        return "SNAFU, if you know what I mean.";
      case ErrorLevel.High:
        return "Reaching TARFU levels";
      case ErrorLevel.SoylentGreen:
        return "ITS PEOPLE!!!!";
      default:
        return "Get your damn dirty hands off me you FILTHY APE!";
    }
  }
}
340
ответ дан 23 November 2019 в 02:28
поделиться

По отношению к Рэю Бойсену в коде есть ошибка: Перечисление ToString с удобными для пользователя строками

Необходимо учитывать несколько атрибутов в значениях перечисления.

public static string GetDescription<T>(this object enumerationValue)
            where T : struct
    {
        Type type = enumerationValue.GetType();
        if (!type.IsEnum)
        {
            throw new ArgumentException("EnumerationValue must be of Enum type", "enumerationValue");
        }

        //Tries to find a DescriptionAttribute for a potential friendly name
        //for the enum
        MemberInfo[] memberInfo = type.GetMember(enumerationValue.ToString());
        if (memberInfo != null && memberInfo.Length > 0)
        {
            object[] attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

            if (attrs != null && attrs.Length > 0 && attrs.Where(t => t.GetType() == typeof(DescriptionAttribute)).FirstOrDefault() != null)
            {
                //Pull out the description value
                return ((DescriptionAttribute)attrs.Where(t=>t.GetType() == typeof(DescriptionAttribute)).FirstOrDefault()).Description;
            }
        }
        //If we have no description attribute, just return the ToString of the enum
        return enumerationValue.ToString();
5
ответ дан 23 November 2019 в 02:28
поделиться
Другие вопросы по тегам:

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