0

次のように列挙型を宣言した名前空間があります。

namespace IXMSoft.Business.SDK.Data
{
using System;

public enum BaudRate
{
    BR115200 = 7,
    BR19200 = 4,
    BR230400 = 8,
    BR2400 = 1,
    BR38400 = 5,
    BR4800 = 2,
    BR57600 = 6,
    BR9600 = 3
  }
}

ステートメントを使用して、別の名前空間にあるコンボ ボックスでこれらの値を取得すると、

comboBox1.Items.Add(BaudRate.BR5700);

たとえば、値を示します

「BR5700」

したいremove BR in front and just want to display the value as "5700"。私は何をすべきか?

4

5 に答える 5

4

DescriptionAttributeおよび適切な拡張メソッドを使用して読み取ります。

public enum BaudRate
{
    [Description("115200 kb")]
    BR115200 = 7,
    [Description("19200 kb")]
    BR19200 = 4,
    [Description("230400 kb")]
    BR230400 = 8,
    [Description("2400 kb")]
    BR2400 = 1,
    [Description("115200 kb")]
    BR38400 = 5,
    [Description("4800 kb")]
    BR4800 = 2,
    [Description("57600 kb")]
    BR57600 = 6,
    [Description("9600 kb")]
    BR9600 = 3
}

拡張方法:

public static class EnumExtension
{
    /// <summary>
    /// Gets the string of an DescriptionAttribute of an Enum.
    /// </summary>
    /// <param name="value">The Enum value for which the description is needed.</param>
    /// <returns>If a DescriptionAttribute is set it return the content of it.
    /// Otherwise just the raw name as string.</returns>
    public static string Description(this Enum value)
    {
        if (value == null)
        {
            throw new ArgumentNullException("value");
        }

        string description = value.ToString();
        FieldInfo fieldInfo = value.GetType().GetField(description);
        DescriptionAttribute[] attributes =
           (DescriptionAttribute[])
         fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);

        if (attributes != null && attributes.Length > 0)
        {
            description = attributes[0].Description;
        }

        return description;
    }

    /// <summary>
    /// Creates an List with all keys and values of a given Enum class
    /// </summary>
    /// <typeparam name="T">Must be derived from class Enum!</typeparam>
    /// <returns>A list of KeyValuePair&lt;Enum, string&gt; with all available
    /// names and values of the given Enum.</returns>
    public static IList<KeyValuePair<Enum, string>> ToList<T>() where T : struct
    {
        var type = typeof(T);

        if (!type.IsEnum)
        {
            throw new ArgumentException("T must be an enum");
        }

        return (IList<KeyValuePair<Enum, string>>)
                Enum.GetValues(type)
                    .OfType<Enum>()
                    .Select(e => new KeyValuePair<Enum, string>(e, e.Description()))
                    .ToArray();
    }

    public static T GetValueFromDescription<T>(string description) where T : struct
    {
        var type = typeof(T);

        if(!type.IsEnum)
        {
            throw new ArgumentException("T must be an enum");
        }

        foreach(var field in type.GetFields())
        {
            var attribute = Attribute.GetCustomAttribute(field,
                typeof(DescriptionAttribute)) as DescriptionAttribute;

            if(attribute != null)
            {
                if(attribute.Description == description)
                {
                    return (T)field.GetValue(null);
                }
            }
            else
            {
                if(field.Name == description)
                {
                    return (T)field.GetValue(null);
                }
            }
        }

        throw new ArgumentOutOfRangeException("description");
        // or return default(T);
    }
}

で、次のように呼び出して、これをコンボ ボックスに簡単に適用できます。

var list = EnumExtension.ToList<BaudRate>();
myComboBox.DataSource = list;
myComboBox.ValueMember = "Key";
myComboBox.DisplayMember = "Value";
于 2013-05-27T07:08:49.247 に答える
2

string.replace の例:

BaudRate.BR115200.ToString().Replace("BR","");

部分文字列の例:

BaudRate.BR115200.ToString().Substring(2);
于 2013-05-27T07:05:12.093 に答える
2

列挙名から BR を削除することは、最も論理的な行動のように思えます。列挙型自体の名前が であることを考えるとBaudRate、BR は冗長です。また、すべての値に存在することを考えると、値の名前に説明力を追加することはありません。また、列挙型の値には常に列挙型の名前がプレフィックスとして付けられるため、結果は常に明確になります (BaudRate.9600ではなくBaudRate.BR9600)。

これを行うことができない/したくない場合はBaudRate.XXX.ToString().Substring(2)、最初の 2 文字を削除するために、追加する前に各値に対して a を実行する必要があります。

于 2013-05-27T07:06:26.580 に答える
1
public enum BaudRate
{
    BR115200 = 7,
    BR19200 = 4,
    BR230400 = 8,
    BR2400 = 1,
    BR38400 = 5,
    BR4800 = 2,
    BR57600 = 6,
    BR9600 = 3
  }
}

foreach (string name in Enum.GetNames(BaudRate))
{
    cmbEnum.Items.Add(name.Replace("BR",""));
}
于 2013-05-27T07:08:10.560 に答える
0

以下に示すようにコンボボックスを定義します。

<combobox>
   <ComboBoxItem>--</ComboBoxItem>
   <ComboBoxItem>2400</ComboBoxItem>
   <ComboBoxItem>4800</ComboBoxItem>
   <ComboBoxItem>9600</ComboBoxItem>
   <ComboBoxItem>19200</ComboBoxItem> // and soo on
</combobox>

Enumをコンボボックスにバインドします

于 2013-05-27T07:23:48.417 に答える