7

関連: 列挙型属性から列挙型を取得

列挙型とそれに関連付けられたローカライズされた文字列値を何かにバインドするための最も保守しやすい方法が必要です。

列挙型とクラスを同じファイルに貼り付けると、ある程度安全だと感じますが、もっと良い方法があると思います。また、列挙型の名前をリソースの文字列名と同じにすることも検討しましたが、それを強制するために常にここにいるとは限りません。

using CR = AcmeCorp.Properties.Resources;

public enum SourceFilterOption
{
    LastNumberOccurences,
    LastNumberWeeks,
    DateRange
    // if you add to this you must update FilterOptions.GetString
}

public class FilterOptions
{
    public Dictionary<SourceFilterOption, String> GetEnumWithResourceString()
    {
        var dict = new Dictionary<SourceFilterOption, String>();
        foreach (SourceFilterOption filter in Enum.GetValues(typeof(SourceFilterOption)))
        {
            dict.Add(filter, GetString(filter));
        }
        return dict;
    }

    public String GetString(SourceFilterOption option)
    {
        switch (option)
        {
            case SourceFilterOption.LastNumberOccurences:
                return CR.LAST_NUMBER_OF_OCCURANCES;
            case SourceFilterOption.LastNumberWeeks:
                return CR.LAST_NUMBER_OF_WEEKS;
            case SourceFilterOption.DateRange:
            default:
                return CR.DATE_RANGE;
        }
    }
}
4

5 に答える 5

10

各列挙値にDescriptionAttributeを追加できます。

public enum SourceFilterOption
{
    [Description("LAST_NUMBER_OF_OCCURANCES")]
    LastNumberOccurences,
    ...
}

必要に応じて説明(リソースキー)を引き出します。

FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute),     
if (attributes.Length > 0)
{
    return attributes[0].Description;
}
else
{
    return value.ToString();
}

http://geekswithblogs.net/paulwhitblog/archive/2008/03/31/use-the-descriptionattribute-with-an-enum-to-display-status-messages.aspx

編集:コメントへの応答(@Tergiver)。私の例で(既存の)DescriptionAttributeを使用すると、ジョブをすばやく実行できます。目的外の属性を使用するのではなく、独自のカスタム属性を実装する方がよいでしょう。このようなもの:

[AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inheritable = false)]
public class EnumResourceKeyAttribute : Attribute
{
 public string ResourceKey { get; set; }
}
于 2012-07-17T22:32:33.753 に答える
1

誰かが正しく更新しないと、すぐにクラッシュする可能性があります。

public String GetString(SourceFilterOption option)
{
    switch (option)
    {
        case SourceFilterOption.LastNumberOccurences:
            return CR.LAST_NUMBER_OF_OCCURANCES;
        case SourceFilterOption.LastNumberWeeks:
            return CR.LAST_NUMBER_OF_WEEKS;
        case SourceFilterOption.DateRange:
            return CR.DATE_RANGE;
        default:
            throw new Exception("SourceFilterOption " + option + " was not found");
    }
}
于 2012-07-18T13:28:14.107 に答える
1

次の方法でリソースへのマッピングを行います。1。2つのパラメーター(リソースのタイプとその名前)を取得するctorを使用してクラスStringDescriptionを定義します。

[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
class StringDescriptionAttribute : Attribute
{
    private string _name;
    public StringDescriptionAttribute(string name)
    {
        _name = name;
    }

    public StringDescriptionAttribute(Type resourseType, string name)
    {
            _name = new ResourceManager(resourseType).GetString(name);

    }
    public string Name { get { return _name; } }
}
  1. いずれかのカルチャのリソースファイルを作成します(たとえば、WebTexts.resxおよびWebtexts.ru.resx)。赤、緑などの色にしましょう...

  2. 列挙型を定義します:

    enum Colour {[StringDescription(typeof(WebTexts)、 "Red")] Red = 1、[StringDescription(typeof(WebTexts)、 "Green")] Green = 2、[StringDescription(typeof(WebTexts)、 "Blue")]青=3、[StringDescription( "くまのあるAntracit")] AntracitWithMadDarkCircles

    }

  3. リフレクションを介してリソースの説明を取得する静的メソッドを定義する

    public static string GetStringDescription(Enum en){

        var enumValueName = Enum.GetName(en.GetType(),en);
    
        FieldInfo fi = en.GetType().GetField(enumValueName);
    
        var attr = (StringDescriptionAttribute)fi.GetCustomAttribute(typeof(StringDescriptionAttribute));
    
        return attr != null ? attr.Name : "";
    }
    
  4. 食べる :

    カラー列; col = Colour.Red; Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo( "en-US");

        var ListOfColors = typeof(Colour).GetEnumValues().Cast<Colour>().Select(p => new { Id = p, Decr = GetStringDescription(p) }).ToList();
    
        foreach (var listentry in ListOfColors)
            Debug.WriteLine(listentry.Id + " " + listentry.Decr);
    
于 2015-08-26T06:45:25.097 に答える
1

リソースファイルからカルチャに応じて列挙型の説明値を取得する最も簡単な方法があります

私の列挙型

  public enum DiagnosisType
    {
        [Description("Nothing")]
        NOTHING = 0,
        [Description("Advice")]
        ADVICE = 1,
        [Description("Prescription")]
        PRESCRIPTION = 2,
        [Description("Referral")]
        REFERRAL = 3

}

リソースファイルとキーを列挙型と同じに作成しました説明値

リソースファイルと列挙型のキーと値の画像、クリックしてリソースファイルの画像を表示

   public static string GetEnumDisplayNameValue(Enum enumvalue)
    {
        var name = enumvalue.ToString();
        var culture = Thread.CurrentThread.CurrentUICulture;
        var converted = YourProjectNamespace.Resources.Resource.ResourceManager.GetString(name, culture);
        return converted;
    }

ビューでこのメソッドを呼び出す

  <label class="custom-control-label" for="othercare">YourNameSpace.Yourextenstionclassname.GetEnumDisplayNameValue(EnumHelperClass.DiagnosisType.NOTHING )</label>

それはあなたの文化に文字列accordigを返します

于 2018-09-24T07:08:12.297 に答える
0

ここでWPFで使用する必要がありますこれが私がそれを達成する方法です

まず、属性を定義する必要があります

public class LocalizedDescriptionAttribute : DescriptionAttribute
{
    private readonly string _resourceKey;
    private readonly ResourceManager _resource;
    public LocalizedDescriptionAttribute(string resourceKey, Type resourceType)
    {
        _resource = new ResourceManager(resourceType);
        _resourceKey = resourceKey;
    }

    public override string Description
    {
        get
        {
            string displayName = _resource.GetString(_resourceKey);

            return string.IsNullOrEmpty(displayName)
                ? string.Format("[[{0}]]", _resourceKey)
                : displayName;
        }
    }
}

この属性を次のように使用できます

public enum OrderType
{
    [LocalizedDescription("DineIn", typeof(Properties.Resources))]
    DineIn = 1,
    [LocalizedDescription("Takeaway", typeof(Properties.Resources))]
    Takeaway = 2
}

次に、次のようなコンバーターを定義します

public class EnumToDescriptionConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo language)
    {
        var enumValue = value as Enum;

        return enumValue == null ? DependencyProperty.UnsetValue : enumValue.GetDescriptionFromEnumValue();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo language)
    {
        return value;
    }
}

次に、XAMLで

<cr:EnumToDescriptionConverter x:Key="EnumToDescriptionConverter" />

<TextBlock Text="{Binding Converter={StaticResource EnumToDescriptionConverter}}"/>
于 2017-11-23T23:58:42.467 に答える