1

以下のようにenumを使用できますか?

TeamManager、TeamLeader、SeniorDeveloperなどのようにできますが、「Team Manager」のように単語の間にスペースを入れたいです

public enum SoftwareEmployee
{
    Team Manager = 1,
    Team Leader = 2,
    Senior Developer = 3,
    Junior = 4
}
4

3 に答える 3

12

いいえ、代わりにこれを行うことができます:

public enum SoftwareEmployee {
    [Description("Team Manager")] TeamManager = 1,
    [Description("Team Leader")] TeamLeader = 2,
    [Description("Senior Developer")] SeniorDeveloper = 3,
    [Description("Junior")] Junior = 4
}

次に、ユーティリティ メソッドを使用して列挙型の値を説明に変換できます。次に例を示します。

    /// <summary>
    /// Given an enum value, if a <see cref="DescriptionAttribute"/> attribute has been defined on it, then return that.
    /// Otherwise return the enum name.
    /// </summary>
    /// <typeparam name="T">Enum type to look in</typeparam>
    /// <param name="value">Enum value</param>
    /// <returns>Description or name</returns>
    public static string ToDescription<T>(this T value) where T : struct {
        if(!typeof(T).IsEnum) {
            throw new ArgumentException(Properties.Resources.TypeIsNotAnEnum, "T");
        }
        var fieldName = Enum.GetName(typeof(T), value);
        if(fieldName == null) {
            return string.Empty;
        }
        var fieldInfo = typeof(T).GetField(fieldName, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Static);
        if(fieldInfo == null) {
            return string.Empty;
        }
        var descriptionAttribute = (DescriptionAttribute) fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault();
        if(descriptionAttribute == null) {
            return fieldInfo.Name;
        }
        return descriptionAttribute.Description;
    }

switchすべてが一緒であれば、列挙型の定義を維持する方が簡単なので、を介した手動の翻訳よりもこれを好みます。

説明テキストのローカライズを許可するには、 ResourceDescriptionなど、リソースから値を取得する別の説明属性を使用します。Descriptionから継承している限り、問題なく動作します。例えば:

public enum SoftwareEmployee {
    [ResourceDescription(typeof(SoftwareEmployee), Properties.Resources.TeamManager)] TeamManager = 1,
    [ResourceDescription(typeof(SoftwareEmployee), Properties.Resources.TeamLeader)] TeamLeader = 2,
    [ResourceDescription(typeof(SoftwareEmployee), Properties.Resources.SeniorDeveloper)] SeniorDeveloper = 3,
    [ResourceDescription(typeof(SoftwareEmployee), Properties.Resources.Junior)] Junior = 4
}
于 2013-04-10T08:04:29.987 に答える
5

コンパイル エラーが発生するため、スペースを指定することはできません。表示目的で必要な場合。次に、列挙が渡されたときに UI に適した文字列を返すメソッドを作成できます。

何かのようなもの:

public string GetUIFriendlyString(SoftwareEmployee employee)
{
    switch (employee):
    {
      case TeamLeader: return "Team Leader";
      // same for the rest
    }
}

または@Christian Hayterによって提案されているように、列挙型で属性を使用します

于 2013-04-10T08:05:15.820 に答える
1

いいえ、できません。これはコンパイルできません。

Senior_Developer という単語の間にアンダースコアを入れることができますが、コードを書いているのか、それともエッセイを書いているのかを自問する必要があります。コードは判読可能であるべきですが、文のように見える必要はありません。

これを行う唯一の理由は、UI に出力できるようにするためです。列挙型や例外などのコードは UI に出力しないでください。最初は便利ですが、何らかのマッピングを使用して列挙型をプレーン テキストに変換する必要があります。これは、複数のローカルを処理する必要がある場合に特に便利です。

于 2013-04-10T08:06:06.177 に答える