以下のようにenumを使用できますか?
TeamManager、TeamLeader、SeniorDeveloperなどのようにできますが、「Team Manager」のように単語の間にスペースを入れたいです
public enum SoftwareEmployee
{
Team Manager = 1,
Team Leader = 2,
Senior Developer = 3,
Junior = 4
}
いいえ、代わりにこれを行うことができます:
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
}
コンパイル エラーが発生するため、スペースを指定することはできません。表示目的で必要な場合。次に、列挙が渡されたときに UI に適した文字列を返すメソッドを作成できます。
何かのようなもの:
public string GetUIFriendlyString(SoftwareEmployee employee)
{
switch (employee):
{
case TeamLeader: return "Team Leader";
// same for the rest
}
}
または@Christian Hayterによって提案されているように、列挙型で属性を使用します
いいえ、できません。これはコンパイルできません。
Senior_Developer という単語の間にアンダースコアを入れることができますが、コードを書いているのか、それともエッセイを書いているのかを自問する必要があります。コードは判読可能であるべきですが、文のように見える必要はありません。
これを行う唯一の理由は、UI に出力できるようにするためです。列挙型や例外などのコードは UI に出力しないでください。最初は便利ですが、何らかのマッピングを使用して列挙型をプレーン テキストに変換する必要があります。これは、複数のローカルを処理する必要がある場合に特に便利です。