এমভিসি রেজার কোডের মাধ্যমে কোনও এনাম সদস্যের প্রদর্শনের নামের বৈশিষ্ট্যটি কীভাবে পাবেন?


211

আমার প্রচারে "প্রোমোশন" নামে একটি মডেল পেয়েছি যে এর ধরণটি "ব্যবহারকারীপ্রোমেশন" নামে পরিচিত একটি পতাকা এনাম। আমার এনামের সদস্যদের প্রদর্শন বৈশিষ্ট্যগুলি নীচে সেট করা আছে:

[Flags]
public enum UserPromotion
{
    None = 0x0,

    [Display(Name = "Send Job Offers By Mail")]
    SendJobOffersByMail = 0x1,

    [Display(Name = "Send Job Offers By Sms")]
    SendJobOffersBySms = 0x2,

    [Display(Name = "Send Other Stuff By Sms")]
    SendPromotionalBySms = 0x4,

    [Display(Name = "Send Other Stuff By Mail")]
    SendPromotionalByMail = 0x8
}

আমার "প্রচার" সম্পত্তিটির নির্বাচিত মানগুলি দেখানোর জন্য আমি এখন আমার দৃষ্টিতে একটি উল তৈরি করতে সক্ষম হতে চাই। আমি এখন পর্যন্ত যা করেছি এটিই কিন্তু সমস্যাটি হ'ল আমি এখানে প্রদর্শনের নামগুলি কীভাবে পেতে পারি?

<ul>
    @foreach (int aPromotion in @Enum.GetValues(typeof(UserPromotion)))
    {
        var currentPromotion = (int)Model.JobSeeker.Promotion;
        if ((currentPromotion & aPromotion) == aPromotion)
        {
        <li>Here I don't know how to get the display attribute of "currentPromotion".</li>
        }
    }
</ul>

12
এমভিসি 5, এনমগুলিতে ডিসপ্লে নাম অ্যাট্রিবিউটকে সমর্থন করে।
বার্ট ক্যালিক্স্টো

10
পরিষ্কার হতে: শুধুমাত্র System.ComponentModel.DataAnnotations.DisplayAttribute। না System.ComponentModel.DisplayNameAttribute
কামরানিকাস

1
এর মধ্যে কি প্রতিবিম্বের ব্যবহার অন্তর্ভুক্ত রয়েছে এবং তাই কার্যকারিতা প্রভাবিত করে? 'এটিকে অনেক সময় বলা হবে।
নিকো

উত্তর:


182

হালনাগাদ

প্রথম সমাধানটি এনুম থেকে ডিসপ্লে নাম পাওয়ার দিকে দৃষ্টি নিবদ্ধ করা হয়েছিল। নীচের কোডটি আপনার সমস্যার সঠিক সমাধান হওয়া উচিত।

আপনি enums জন্য এই সহায়ক শ্রেণি ব্যবহার করতে পারেন:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;

public static class EnumHelper<T>
{
    public static IList<T> GetValues(Enum value)
    {
        var enumValues = new List<T>();

        foreach (FieldInfo fi in value.GetType().GetFields(BindingFlags.Static | BindingFlags.Public))
        {
            enumValues.Add((T)Enum.Parse(value.GetType(), fi.Name, false));
        }
        return enumValues;
    }

    public static T Parse(string value)
    {
        return (T)Enum.Parse(typeof(T), value, true);
    }

    public static IList<string> GetNames(Enum value)
    {
        return value.GetType().GetFields(BindingFlags.Static | BindingFlags.Public).Select(fi => fi.Name).ToList();
    }

    public static IList<string> GetDisplayValues(Enum value)
    {
        return GetNames(value).Select(obj => GetDisplayValue(Parse(obj))).ToList();
    }

    private static string lookupResource(Type resourceManagerProvider, string resourceKey)
    {
        foreach (PropertyInfo staticProperty in resourceManagerProvider.GetProperties(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public))
        {
            if (staticProperty.PropertyType == typeof(System.Resources.ResourceManager))
            {
                System.Resources.ResourceManager resourceManager = (System.Resources.ResourceManager)staticProperty.GetValue(null, null);
                return resourceManager.GetString(resourceKey);
            }
        }

        return resourceKey; // Fallback with the key name
    }

    public static string GetDisplayValue(T value)
    {
        var fieldInfo = value.GetType().GetField(value.ToString());

        var descriptionAttributes = fieldInfo.GetCustomAttributes(
            typeof(DisplayAttribute), false) as DisplayAttribute[];

        if (descriptionAttributes[0].ResourceType != null)
            return lookupResource(descriptionAttributes[0].ResourceType, descriptionAttributes[0].Name);

        if (descriptionAttributes == null) return string.Empty;
        return (descriptionAttributes.Length > 0) ? descriptionAttributes[0].Name : value.ToString();
    }
}

এবং তারপরে আপনি এটিকে আপনার দৃষ্টিতে নিম্নলিখিত হিসাবে ব্যবহার করতে পারেন:

<ul>
    @foreach (var value in @EnumHelper<UserPromotion>.GetValues(UserPromotion.None))
    {
         if (value == Model.JobSeeker.Promotion)
        {
            var description = EnumHelper<UserPromotion>.GetDisplayValue(value);
            <li>@Html.DisplayFor(e => description )</li>
        }
    }
</ul>

আশা করি এটা সাহায্য করবে! :)


8
উত্তরগুলির সমস্তগুলি ব্যবহার করে .ToStringতবে স্ট্যাকওভারফ্লো.com / q / 483794 / 179311 থেকে এটি Enum.GetNameপরিবর্তে ব্যবহার করতে বলে ।
bradlis7

মান.গেটটাইপ ()। গেটফিল্ড (value.ToString ()) ঠিক আমি যা খুঁজছিলাম তা ছিল!
সিডি

এই উত্তরটি কিছু যোগ নাল পরীক্ষণ সাথে জরিমানা, কিন্তু আপনি যদি dotfuscation ব্যবহার করছেন না এ উত্তর stackoverflow.com/a/4412730/852806 সহজ বলে মনে হয়।
হকিজে

5
ইন GetDisplayValueআপনি যদি প্রথম পরীক্ষা করা উচিত descriptionAttributes == nullআপনি অ্যারে অ্যাক্সেস করতে চেষ্টা করার আগে: descriptionAttributes[0]। অন্যথায় আপনি একটি ব্যতিক্রম উত্থাপন করতে পারেন এবং নীচের লাইনটি যেখানে নাল পরীক্ষা করেন তা কখনই সত্য হবে না।
রবার্ট এস

আমি নাবালিকাদের পরিবর্তনের পরামর্শ দেব: পাবলিক স্ট্যাটিক আইলিস্ট <T> গেটভ্যালুস (এনাম মান) পাবলিক স্ট্যাটিক আইলিস্ট হতে পারে <T> গেটভ্যালিউস (টি মান)। EnumHelper <T> থেকে => সর্বজনীন স্ট্যাটিক শ্রেণি EnumHelper <T> যেখানে টি: স্ট্রাক্ট, আইকনভারটিবল। স্ট্যাটিক কনস্ট্রাক্টর হতে পারে? স্ট্যাটিক এনামহেল্পার () {if (! typof (T) .IsEnum) {নিক্ষেপ করুন নতুন আর্গুমেন্টএক্সেপশন ("টি অবশ্যই একটি গণিত প্রকারের হতে হবে"); }}
টম

172

একটি লাইনার - ফ্লুয়েন্ট সিনট্যাক্স

public static class Extensions
{
    /// <summary>
    ///     A generic extension method that aids in reflecting 
    ///     and retrieving any attribute that is applied to an `Enum`.
    /// </summary>
    public static TAttribute GetAttribute<TAttribute>(this Enum enumValue) 
            where TAttribute : Attribute
    {
        return enumValue.GetType()
                        .GetMember(enumValue.ToString())
                        .First()
                        .GetCustomAttribute<TAttribute>();
    }
}

উদাহরণ

public enum Season 
{
   [Display(Name = "It's autumn")]
   Autumn,

   [Display(Name = "It's winter")]
   Winter,

   [Display(Name = "It's spring")]
   Spring,

   [Display(Name = "It's summer")]
   Summer
}

public class Foo 
{
    public Season Season = Season.Summer;

    public void DisplayName()
    {
        var seasonDisplayName = Season.GetAttribute<DisplayAttribute>();
        Console.WriteLine("Which season is it?");
        Console.WriteLine (seasonDisplayName.Name);
    } 
}

আউটপুট

এটি কোন seasonতু?
এখন গ্রীষ্মকাল


2
গেটকাস্টমঅ্যাট্রিবিউটের কোনও সংজ্ঞা বিদ্যমান নেই
টিটো

3
নিশ্চিত @Tito যে আপনার প্রকল্পের লক্ষ্য করে করা হয় .NET Framework 4.5এবং যে আপনি নিম্নলিখিত নামব্যবধান সহ করছিSystem.Net System.ComponentModel.DataAnnotations
Aydin,

8
সিস্টেম.রিফ্লেশন ব্যবহার করে; System.ComponentModel.DataAnnotations ব্যবহার করে; আমার জন্য প্রয়োজন ছিল।
পাপিত ললউইট

1
কী ভয়ানক নামকরণ কনভেনশন!
কৌতূহলবাই

@ কিরিয়াসবয় কীভাবে GetAttribute<TAttribute>একটি ভয়ানক নামকরণ কনভেনশন হয়? এটি আপনার নির্দিষ্ট করা বৈশিষ্ট্যটি পুনরুদ্ধার করে এবং সমস্ত পাবলিক পদ্ধতিতে যেমন পাস্কেল কেসিং ব্যবহার করে।
আয়দিন

137

আয়িনের দুর্দান্ত উত্তরের ভিত্তিতে বিল্ডিং , এখানে একটি এক্সটেনশন পদ্ধতি রয়েছে যা কোনও ধরণের পরামিতিগুলির প্রয়োজন হয় না।

using System;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;

public static class EnumExtensions
{
    public static string GetDisplayName(this Enum enumValue)
    {
        return enumValue.GetType()
                        .GetMember(enumValue.ToString())
                        .First()
                        .GetCustomAttribute<DisplayAttribute>()
                        .GetName();
    }
}

দ্রষ্টব্য: নামের সম্পত্তিটির পরিবর্তে getName () ব্যবহার করা উচিত। এটি নিশ্চিত করে যে রিসোর্সটাইপ বৈশিষ্ট্যযুক্ত সম্পত্তি ব্যবহার করে স্থানীয়করণযুক্ত স্ট্রিংটি ফিরে আসবে।

উদাহরণ

এটি ব্যবহার করতে, কেবল আপনার দৃষ্টিতে এনাম মানটি উল্লেখ করুন।

@{
    UserPromotion promo = UserPromotion.SendJobOffersByMail;
}

Promotion: @promo.GetDisplayName()

আউটপুট

প্রচার: মেল মাধ্যমে চাকরীর অফার প্রেরণ করুন


4
নিম্নলিখিত নেমস্পেস যুক্ত করার আশ্বাস: সিস্টেম ব্যবহার করে; System.ComponentModel.DataAnnotations ব্যবহার করে; System.Linq ব্যবহার করে; সিস্টেম.রিফ্লেশন ব্যবহার করে;
পিটার কের

চটজলদি সমাধান, তবে আমি পেয়েছি Temp "টেমপ্লেটগুলি কেবল ক্ষেত্রের অ্যাক্সেস, সম্পত্তি অ্যাক্সেস, একক মাত্রার অ্যারে সূচক বা একক-পরামিতি কাস্টম সূচক এক্সপ্রেশন দিয়ে ব্যবহার করা যেতে পারে" "}
কেসি ক্রুকস্টন

এই ত্রুটি বার্তার জন্য অন্যান্য এসও উত্তরগুলির দিকে তাকানো (আমি এটির সাথে অপরিচিত) মনে হচ্ছে আপনি এটি কোনও এইচটিএমএল সহায়ক সাহায্যকারী পদ্ধতির মধ্যে থেকে ব্যবহার করছেন (যেমন @Html.DisplayFor(m => m.myEnum.GetDisplayName()), যা কার্যকর হবে না, কারণ তারা মূল্যায়ন করার জন্য মূল্যায়িত অভিব্যক্তিটি আশা করে বা অনুরূপ কিছু above উপরের উদাহরণের মতো আপনার খালি এনাম মানটি ব্যবহার করা উচিত
টড

7
আমি GetCustomAttribute<DisplayAttribute>()ফলাফলটিতে একটি নাল রেফারেন্স চেক যুক্ত করেছি কারণ কিছু এনামের পক্ষে সম্ভবত এটি উপস্থিত নেই। এটি প্রদর্শন enumValue.ToString()পত্রে উপস্থিত না থাকলে ফিরে আসে ।
এইচ ডগ

1
আমি এটি তৈরির জন্য এটি ব্যবহার করেছিলাম যা List<SelectListItem>একটি এনুম দ্বারা সমস্ত স্বতন্ত্র DisplayAttribute.Nameটীকা দ্বারা জনবহুল হয়েছিল - এটি পুরোপুরি কাজ করেছে, আপনাকে ধন্যবাদ !! public List<SelectListItem> MySelectListItem = new List<SelectListItem>(); foreach (MyEnum MyEnum in Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Where(x => x != MyEnum.Default)) { MySelectListItem.Add(new SelectListItem() { Text = MyEnum.GetDisplayName(), Value = ((int)MyEnum).ToString() }); }
হপার

61

উপর ভিত্তি করে Aydin, এর উত্তর আমি একটি কম "duplicatious" বাস্তবায়ন সুপারিশ করবে (কারণ আমরা সহজেই পেতে পারে Typeথেকে Enumমান নিজেই পরিবর্তে একটি প্যারামিটার 😉 যেমন প্রদান:

public static string GetDisplayName(this Enum enumValue)
{
    return enumValue.GetType().GetMember(enumValue.ToString())
                   .First()
                   .GetCustomAttribute<DisplayAttribute>()
                   .Name;
}

সম্পাদনা (@ বাহন নাহপেটিয়ান এর মন্তব্যের উপর ভিত্তি করে)

public static string GetDisplayName(this Enum enumValue)
{
    return enumValue.GetType()?
                    .GetMember(enumValue.ToString())?
                    .First()?
                    .GetCustomAttribute<DisplayAttribute>()?
                    .Name;
}

এখন আমরা এটিকে খুব পরিষ্কার ব্যবহার করতে পারি:

public enum Season 
{
    [Display(Name = "The Autumn")]
    Autumn,

    [Display(Name = "The Weather")]
    Winter,

    [Display(Name = "The Tease")]
    Spring,

    [Display(Name = "The Dream")]
    Summer
}

Season.Summer.GetDisplayName();

যার ফলাফল

"স্বপ্ন"


1
এখন পর্যন্ত সমস্ত উত্তরগুলির সবচেয়ে সহজ এবং সহজ। ধন্যবাদ!
কেসি ক্রুকস্টন

আপনার প্রথম সতর্কতা অবলম্বন করা উচিত। এটির জন্য উদাহরণস্বরূপ একটি ব্যতিক্রম ছুঁড়ে ফেলা হবে যদি আপনার এনামের নাম "সমান" হয়
বাহাগন নাহপেটিয়ান

আমি প্রথম () দিয়ে "বিপদ" বুঝতে পারি understand এই বিশেষ ক্ষেত্রে এটি কোনও সমস্যা বলে মনে হচ্ছে না। কারণ এটি একটি এক্সটেনশন পদ্ধতি যেখানে thisঅবশ্যই একটি বৈধ (নাল নয়) এনাম মান হওয়া উচিত। অন্যথায় পদ্ধতিটি কল করা ইতিমধ্যে নিক্ষেপ করবে (যা কলিং কোডের একটি দায়িত্ব)। এটি GetType()নিশ্চিত করে যে সঠিকভাবে এনাম প্রকার প্রদান করবে যা enumvalueনিশ্চিতভাবে সদস্য হবে। তবে গেটকাস্টম অ্যাট্রিবিউটের কোনও নাল মান ফিরে আসতে পারে তাই যখন পদ্ধতি কলগুলির শৃঙ্খলে কোথাও কোথাও একটি নাল রিটার্ন মান থাকে তখন আমি নাল ফেরানোর জন্য পদ্ধতির একটি অ-ব্যতিক্রমী সংস্করণ সরবরাহ করি। ধন্যবাদ!
বার্নোল্লি আইটি

1
আপনার কোডের দ্বিতীয় বৈকল্পিকের জন্য, দেখে মনে হচ্ছে গেটমেম্বারের পরে নাল-কন্ডিশনাল অপারেটর ব্যবহার করার দরকার নেই কারণ এই পদ্ধতিটি সর্বদা মেম্বার ইনফোর অ্যারে দেয় এবং কখনই শূন্য হয় না। এবং আমার কাছে এটি মনে হয় যে কেবলমাত্র ফার্স্টের পরিবর্তে ফার্স্টআরডিফল্ট ব্যবহার করা ভাল। তারপরে ফার্স্টআরডিফল্টের পরে নাল-কন্ডিশনাল অপারেটর ব্যবহার সামঞ্জস্য দেখা যাবে।
অ্যালেক্স 34758

28

আপনি যদি এমভিসি 5.1 বা উচ্চতর ব্যবহার করেন তবে সহজ এবং সুস্পষ্ট উপায় রয়েছে: System.ComponentModel.DataAnnotationsনীচের মতো কেবল ডাটা টীকাটি ( নামস্থান থেকে ) ব্যবহার করুন :

public enum Color
{
    [Display(Name = "Dark red")]
    DarkRed,
    [Display(Name = "Very dark red")]
    VeryDarkRed,
    [Display(Name = "Red or just black?")]
    ReallyDarkRed
}

এবং দেখুন, কেবল এটি যথাযথ এইচটিএমএল সহায়তায় রাখুন:

@Html.EnumDropDownListFor(model => model.Color)

পুনঃটুইট আপনি কি আপনার সমস্যার বর্ণনা দিতে পারবেন? .NET / MVC এর কোন সংস্করণ আপনি ব্যবহার করেন? আপনার কোন ত্রুটি হয়েছে? আরও নির্দিষ্ট করা দয়া করে।
1_বগ

6
কারণ এটি কেবল ড্রপডাউনগুলির জন্য কাজ করে, অন্য কোথাও নয়।
বিভাগটি ফল্ট

2
। নেট
কোরটিতে

3
। নেট কোর HTML_GetEnumSelectList ব্যবহার করে (টাইপফ (আপনারইমন)) @ লোনফিশ
প্যাট্রিক ম্যাকভায়

2
যদি আমরা @ এইচটিএমএল.ডিসপ্লেফোর্স (আপনারইউনফিল্ড) ব্যবহার করতে চাই তবে আমরা ডিসপ্লেটিম্পলেট ডিরেক্টরিতে (শেয়ারড ডিরেক্টরিতে) একটি এনাম সিএসটিএমএল রাখতে পারি। এই ফাইলটিতে আমাদের কেবল 2 লাইন লাগাতে হবে। প্রথমটি হ'ল: "@ মডেল এনাম" দ্বিতীয়টি: "@ গেটডিসপ্লে নাম (মডেল)"। getDisplayName পদ্ধতিটি @ বার্নল্লি আইটি আনসওয়্যারের মতো হওয়া দরকার
বিকাশকারী

11

আপনি Type.GetMember পদ্ধতি ব্যবহার করতে পারেন , তারপরে প্রতিবিম্বটি ব্যবহার করে বিশদ তথ্যটি পান :

// display attribute of "currentPromotion"

var type = typeof(UserPromotion);
var memberInfo = type.GetMember(currentPromotion.ToString());
var attributes = memberInfo[0].GetCustomAttributes(typeof(DisplayAttribute), false);
var description = ((DisplayAttribute)attributes[0]).Name;

এখানে কয়েকটি অনুরূপ পোস্ট ছিল:

এনামের মূল্যের বৈশিষ্ট্যগুলি পাওয়া

এমভিসি 3 ডিসপ্লেফর্ম কিভাবে এনামের ডিসপ্লে-অ্যাট্রিবিউটের মান দেখায়?


8

উপর নির্মাণের টড এর মহান উত্তর যার উপর নির্মিত Aydin, এর মহান উত্তর , এখানে এর জেনেরিক এক্সটেনশন পদ্ধতি যা কোনো ধরনের পরামিতি প্রয়োজন হয় না।

/// <summary>
/// Gets human-readable version of enum.
/// </summary>
/// <returns>DisplayAttribute.Name property of given enum.</returns>
public static string GetDisplayName<T>(this T enumValue) where T : IComparable, IFormattable, IConvertible
{
    if (!typeof(T).IsEnum)
        throw new ArgumentException("Argument must be of type Enum");

    DisplayAttribute displayAttribute = enumValue.GetType()
                                                 .GetMember(enumValue.ToString())
                                                 .First()
                                                 .GetCustomAttribute<DisplayAttribute>();

    string displayName = displayAttribute?.GetName();

    return displayName ?? enumValue.ToString();
}

আমার প্রকল্পের জন্য আমার এটি দরকার ছিল কারণ নীচের কোডের মতো কিছু, যেখানে এনামের প্রতিটি সদস্যের DisplayAttributeটডের সমাধানের সাথে কাজ করে না:

public class MyClass
{
    public enum MyEnum 
    {
        [Display(Name="ONE")]
        One,
        // No DisplayAttribute
        Two
    }
    public void UseMyEnum()
    {
        MyEnum foo = MyEnum.One;
        MyEnum bar = MyEnum.Two;
        Console.WriteLine(foo.GetDisplayName());
        Console.WriteLine(bar.GetDisplayName());
    }
}
// Output:
//
// ONE
// Two

এটি যদি কোনও সাধারণ সমস্যার জটিল সমাধান হয় তবে দয়া করে আমাকে জানান, তবে এটিই ছিল আমার ব্যবহৃত সমাধান।


6
<ul>
    @foreach (int aPromotion in @Enum.GetValues(typeof(UserPromotion)))
    {
        var currentPromotion = (int)Model.JobSeeker.Promotion;
        if ((currentPromotion & aPromotion) == aPromotion)
        {
        <li>@Html.DisplayFor(e => currentPromotion)</li>
        }
    }
</ul>

কাজ করে না: / আমি একটি ত্রুটি InvalidOperationException: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
পাচ্ছি

6

এই প্রশ্নের জন্য আমার দুটি সমাধান রয়েছে।

  1. প্রথম সমাধানটি এনাম থেকে নাম নেওয়ার বিষয়ে on
public enum CourseLocationTypes
{
    [Display(Name = "On Campus")]
    OnCampus,
    [Display(Name = "Online")]
    Online,
    [Display(Name = "Both")]
    Both
}

public static string DisplayName(this Enum value)
{
    Type enumType = value.GetType();
    string enumValue = Enum.GetName(enumType, value);
    MemberInfo member = enumType.GetMember(enumValue)[0];

    object[] attrs = member.GetCustomAttributes(typeof(DisplayAttribute), false);
    string outString = ((DisplayAttribute)attrs[0]).Name;

    if (((DisplayAttribute)attrs[0]).ResourceType != null)
    {
        outString = ((DisplayAttribute)attrs[0]).GetName();
    }

    return outString;
}
<h3 class="product-title white">@Model.CourseLocationType.DisplayName()</h3>
  1. দ্বিতীয় সমাধানটি এনাম নাম থেকে ডিসপ্লে নাম পাওয়ার ক্ষেত্রে রয়েছে তবে এটি বিকাশকারী ভাষায় এনাম বিভক্ত হবে যা একে প্যাচ বলে।
public static string SplitOnCapitals(this string text)
{
        var r = new Regex(@"
            (?<=[A-Z])(?=[A-Z][a-z]) |
             (?<=[^A-Z])(?=[A-Z]) |
             (?<=[A-Za-z])(?=[^A-Za-z])", RegexOptions.IgnorePatternWhitespace);

        return r.Replace(text, " ");
}
 <div class="widget-box pt-0">
     @foreach (var item in Enum.GetNames(typeof(CourseLocationType)))
     {
         <label class="pr-2 pt-1">
             @Html.RadioButtonFor(x => x.CourseLocationType, item, new { type = "radio", @class = "iCheckBox control-label" })&nbsp; @item.SplitOnCapitals()
         </label>
     }
     @Html.ValidationMessageFor(x => x.CourseLocationType)
 </div>

5

এএসপি.নেট কোর 3.0 এর জন্য, এটি আমার জন্য কাজ করেছে (পূর্ববর্তী উত্তরদাতাদের ক্রেডিট)।

আমার এনাম ক্লাস:

using System;
using System.Linq;
using System.ComponentModel.DataAnnotations;
using System.Reflection;

public class Enums
{
    public enum Duration
    { 
        [Display(Name = "1 Hour")]
        OneHour,
        [Display(Name = "1 Day")]
        OneDay
    }

    // Helper method to display the name of the enum values.
    public static string GetDisplayName(Enum value)
    {
        return value.GetType()?
       .GetMember(value.ToString())?.First()?
       .GetCustomAttribute<DisplayAttribute>()?
       .Name;
    }
}

আমার ভিউ মডেল ক্লাস:

public class MyViewModel
{
    public Duration Duration { get; set; }
}

একটি রেজার ভিউয়ের একটি উদাহরণ যা একটি লেবেল এবং একটি ড্রপ-ডাউন তালিকা প্রদর্শন করে। লক্ষ্য করুন ড্রপ-ডাউন তালিকার কোনও সহায়ক পদ্ধতির প্রয়োজন নেই:

@model IEnumerable<MyViewModel> 

@foreach (var item in Model)
{
    <label asp-for="@item.Duration">@Enums.GetDisplayName(item.Duration)</label>
    <div class="form-group">
        <label asp-for="@item.Duration" class="control-label">Select Duration</label>
        <select asp-for="@item.Duration" class="form-control"
            asp-items="Html.GetEnumSelectList<Enums.Duration>()">
        </select>
    </div>
}

আমি getDisplayName পদ্ধতি রিটার্ন স্ট্রিংয়ে একটি চেক যুক্ত করব? enumValue.ToString (): retVal;
স্নাইপ

4

সেই বৈশিষ্ট্যটি অ্যাক্সেস করার জন্য আপনাকে কিছুটা প্রতিবিম্ব ব্যবহার করতে হবে:

var type = typeof(UserPromotion);
var member = type.GetMember(Model.JobSeeker.Promotion.ToString());
var attributes = member[0].GetCustomAttributes(typeof(DisplayAttribute), false);
var name = ((DisplayAttribute)attributes[0]).Name;

আমি এই পদ্ধতিটি কোনও এক্সটেনশন পদ্ধতিতে মোড়ানো বা একটি ভিউ মডেলে এটি সম্পাদন করার পরামর্শ দিচ্ছি।


4

কোর 2.1 সহ,

public static string GetDisplayName(Enum enumValue)
{
  return enumValue.GetType()?
 .GetMember(enumValue.ToString())?[0]?
 .GetCustomAttribute<DisplayAttribute>()?
 .Name;
}

4

উপরে থেকে সমস্ত প্রান্ত-কেস একত্রিত করে:

  • বেস অবজেক্টের সদস্যদের নাম ( Equals, ToString) সহ এনাম সদস্য
  • alচ্ছিক Displayবৈশিষ্ট্য

এখানে আমার কোড:

public enum Enum
{
    [Display(Name = "What a weird name!")]
    ToString,

    Equals
}

public static class EnumHelpers
{
    public static string GetDisplayName(this Enum enumValue)
    {
        var enumType = enumValue.GetType();

        return enumType
                .GetMember(enumValue.ToString())
                .Where(x => x.MemberType == MemberTypes.Field && ((FieldInfo)x).FieldType == enumType)
                .First()
                .GetCustomAttribute<DisplayAttribute>()?.Name ?? enumValue.ToString();
    }
}

void Main()
{
    Assert.Equals("What a weird name!", Enum.ToString.GetDisplayName());
    Assert.Equals("Equals", Enum.Equals.GetDisplayName());
}

Solutionচ্ছিক প্রদর্শন বৈশিষ্ট্য পরিচালনা করে এমন দুর্দান্ত সমাধান। ধন্যবাদ!
ওয়েলসপ্রিং

3

আমি এটি করার জন্য দুঃখিত, কিন্তু আমি অন্য কোনও উত্তর যেমনটি ব্যবহার করতে পারি নি তেমন মন্তব্যগুলিতে এটিকে সন্ধান করার মতো সময় পাইনি।

সি # 6 সিনট্যাক্স ব্যবহার করে।

static class EnumExtensions
{
    /// returns the localized Name, if a [Display(Name="Localised Name")] attribute is applied to the enum member
    /// returns null if there isnt an attribute
    public static string DisplayNameOrEnumName(this Enum value)
    // => value.DisplayNameOrDefault() ?? value.ToString()
    {
        // More efficient form of ^ based on http://stackoverflow.com/a/17034624/11635
        var enumType = value.GetType();
        var enumMemberName = Enum.GetName(enumType, value);
        return enumType
            .GetEnumMemberAttribute<DisplayAttribute>(enumMemberName)
            ?.GetName() // Potentially localized
            ?? enumMemberName; // Or fall back to the enum name
    }

    /// returns the localized Name, if a [Display] attribute is applied to the enum member
    /// returns null if there is no attribute
    public static string DisplayNameOrDefault(this Enum value) =>
        value.GetEnumMemberAttribute<DisplayAttribute>()?.GetName();

    static TAttribute GetEnumMemberAttribute<TAttribute>(this Enum value) where TAttribute : Attribute =>
        value.GetType().GetEnumMemberAttribute<TAttribute>(value.ToString());

    static TAttribute GetEnumMemberAttribute<TAttribute>(this Type enumType, string enumMemberName) where TAttribute : Attribute =>
        enumType.GetMember(enumMemberName).Single().GetCustomAttribute<TAttribute>();
}

2

আয়িন এবং টডের উত্তরগুলিতে আরও বিল্ডিং করা, এখানে একটি এক্সটেনশন পদ্ধতি রয়েছে যা আপনাকে কোনও উত্স ফাইল থেকে নাম পেতে দেয়

using AppResources;
using System;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
using System.Resources;

public static class EnumExtensions
{
    public static string GetDisplayName(this Enum enumValue)
    {
        var enumMember= enumValue.GetType()
                        .GetMember(enumValue.ToString());

        DisplayAttribute displayAttrib = null;
        if (enumMember.Any()) {
            displayAttrib = enumMember 
                        .First()
                        .GetCustomAttribute<DisplayAttribute>();
        }

        string name = null;
        Type resource = null;

        if (displayAttrib != null)
        {
            name = displayAttrib.Name;
            resource = displayAttrib.ResourceType;
        }

        return String.IsNullOrEmpty(name) ? enumValue.ToString()
            : resource == null ?  name
            : new ResourceManager(resource).GetString(name);
    }
}

এবং এটি পছন্দ করুন

public enum Season 
{
    [Display(ResourceType = typeof(Resource), Name = Season_Summer")]
    Summer
}

আমি আমার প্রকল্পের জন্য এটি কাজ করার চেষ্টা করছি তবে আমি "নতুন রিসোর্স ম্যানেজার (সংস্থান)। গেটস্ট্রিং (নাম) দিয়ে একটি ত্রুটি পেয়েছি;" লাইন। আমি একটি প্রশ্ন জিজ্ঞাসা করেছি ( স্ট্যাকওভারফ্লো.com/ জিজ্ঞাসা / ৩১১৯১২২৫ / / ) এবং আমাকে এখানে পাঠানো হয়েছিল। যখন আমি "রিসোর্সস ম্যানেজার (রিসোর্স)" দেখি যখন এটি চলাকালীন "রিসোর্স.ইমনস.সোর্স" প্রদান করে। কোন সাহায্যের ব্যাপকভাবে প্রশংসা হবে। ধন্যবাদ!
করিনে

আপনার কিছু এনাম মানগুলির জন্য প্রদর্শনের নাম সেট না থাকাকালীন নালগুলি হ্যান্ডেল করার জন্য কোডটি আপডেট করেছেন - সহায়তা করতে পারে
পিটার কের

এখনও কাজ করেনি। আমি আমার প্রশ্নটি ত্রুটি বার্তার সাহায্যে স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ৩৩১৯১২২১ / ২ এ আপডেট করেছি । সাহায্যের জন্য ধন্যবাদ!
করিনে

1

আমি সংস্কৃতি নির্ভর গেটডিসপ্লে নাম এনাম এক্সটেনশনে অবদান রাখতে চাই। আশা করি আমার মতো এই উত্তরটি গুগল করা প্রত্যেকের পক্ষে এটি কার্যকর হবে:

আয়িন অ্যাডন এবং টড যেমন উল্লেখ করেছেন "স্ট্যান্ডার্ট" উপায় :

    public static string GetDisplayName(this Enum enumValue)
    {
        return enumValue
            .GetType()
            .GetMember(enumValue.ToString())
            .First()
            .GetCustomAttribute<DisplayAttribute>()
            .GetName();
    }

"সংস্কৃতি নির্ভর" উপায়:

    public static string GetDisplayName(this Enum enumValue, CultureInfo ci)
    {
        var displayAttr = enumValue
            .GetType()
            .GetMember(enumValue.ToString())
            .First()
            .GetCustomAttribute<DisplayAttribute>();

        var resMan = displayAttr.ResourceType?.GetProperty(@"ResourceManager", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).GetValue(null, null) as ResourceManager;

        return resMan?.GetString(displayAttr.Name, ci) ?? displayAttr.GetName();
    }

1

2020 আপডেট: এই থ্রেডে অনেকের দ্বারা সরবরাহ করা ফাংশনের একটি আপডেট সংস্করণ তবে এখন সি # 7.3 এর পরে:

এখন আপনি জেনেরিক পদ্ধতিগুলিকে এনামের ধরণগুলিতে সীমাবদ্ধ করতে পারেন যাতে আপনি আপনার সমস্ত এনামগুলির সাথে এটি ব্যবহারের জন্য একক পদ্ধতিতে এক্সটেনশন লিখতে পারেন:

জেনেরিক এক্সটেনশন পদ্ধতি:

public static string ATexto<T>(this T enumeración) where T : struct, Enum {
    var tipo = enumeración.GetType();
    return tipo.GetMember(enumeración.ToString())
    .Where(x => x.MemberType == MemberTypes.Field && ((FieldInfo)x).FieldType == tipo).First()
    .GetCustomAttribute<DisplayAttribute>()?.Name ?? enumeración.ToString();
} 

এনাম:

public enum TipoImpuesto { 
IVA, INC, [Display(Name = "IVA e INC")]IVAeINC, [Display(Name = "No aplica")]NoAplica };

এটি কিভাবে ব্যবহার করতে:

var tipoImpuesto = TipoImpuesto.IVAeINC;
var textoTipoImpuesto = tipoImpuesto.ATexto(); // Prints "IVA e INC".

বোনাস, পতাকা সহ এনামস: আপনি যদি সাধারণ এনামদের সাথে সম্পর্কিত হন তবে উপরের ফাংশনটি যথেষ্ট, তবে আপনার এনামগুলির মধ্যে যদি কোনও পতাকা ব্যবহার করে একাধিক মান নিতে পারে তবে আপনাকে এটির মতো এটি সংশোধন করতে হবে (এই কোডটি সি # 8 ব্যবহার করে) অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে):

    public static string ATexto<T>(this T enumeración) where T : struct, Enum {

        var tipo = enumeración.GetType();
        var textoDirecto = enumeración.ToString();

        string obtenerTexto(string textoDirecto) => tipo.GetMember(textoDirecto)
            .Where(x => x.MemberType == MemberTypes.Field && ((FieldInfo)x).FieldType == tipo)
            .First().GetCustomAttribute<DisplayAttribute>()?.Name ?? textoDirecto;

        if (textoDirecto.Contains(", ")) {

            var texto = new StringBuilder();
            foreach (var textoDirectoAux in textoDirecto.Split(", ")) {
                texto.Append($"{obtenerTexto(textoDirectoAux)}, ");
            }
            return texto.ToString()[0..^2];

        } else {
            return obtenerTexto(textoDirecto);
        }

    } 

পতাকা সহ এনাম:

[Flags] public enum TipoContribuyente {
    [Display(Name = "Común")] Común = 1, 
    [Display(Name = "Gran Contribuyente")] GranContribuyente = 2, 
    Autorretenedor = 4, 
    [Display(Name = "Retenedor de IVA")] RetenedorIVA = 8, 
    [Display(Name = "Régimen Simple")] RégimenSimple = 16 } 

এটি কিভাবে ব্যবহার করতে:

var tipoContribuyente = TipoContribuyente.RetenedorIVA | TipoContribuyente.GranContribuyente;
var textoAux = tipoContribuyente.ATexto(); // Prints "Gran Contribuyente, Retenedor de IVA".

0

পূর্ববর্তী উত্তরের উপর ভিত্তি করে আমি সমস্ত ডিসপ্লেএট্রিবিউট বৈশিষ্ট্যগুলিকে পঠনযোগ্য উপায়ে সমর্থন করার জন্য এই আরামদায়ক সহায়ক তৈরি করেছি:

public static class EnumExtensions
    {
        public static DisplayAttributeValues GetDisplayAttributeValues(this Enum enumValue)
        {
            var displayAttribute = enumValue.GetType().GetMember(enumValue.ToString()).First().GetCustomAttribute<DisplayAttribute>();

            return new DisplayAttributeValues(enumValue, displayAttribute);
        }

        public sealed class DisplayAttributeValues
        {
            private readonly Enum enumValue;
            private readonly DisplayAttribute displayAttribute;

            public DisplayAttributeValues(Enum enumValue, DisplayAttribute displayAttribute)
            {
                this.enumValue = enumValue;
                this.displayAttribute = displayAttribute;
            }

            public bool? AutoGenerateField => this.displayAttribute?.GetAutoGenerateField();
            public bool? AutoGenerateFilter => this.displayAttribute?.GetAutoGenerateFilter();
            public int? Order => this.displayAttribute?.GetOrder();
            public string Description => this.displayAttribute != null ? this.displayAttribute.GetDescription() : string.Empty;
            public string GroupName => this.displayAttribute != null ? this.displayAttribute.GetGroupName() : string.Empty;
            public string Name => this.displayAttribute != null ? this.displayAttribute.GetName() : this.enumValue.ToString();
            public string Prompt => this.displayAttribute != null ? this.displayAttribute.GetPrompt() : string.Empty;
            public string ShortName => this.displayAttribute != null ? this.displayAttribute.GetShortName() : this.enumValue.ToString();
        }
    }

0

আমি এটি সম্পাদনা হিসাবে করার চেষ্টা করেছি তবে তা প্রত্যাখ্যান করা হয়েছিল; আমি দেখতে পাচ্ছি না কেন।

উপরেরটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে যদি আপনি এটিকে এনাম দিয়ে কল করেন যা কাস্টম বৈশিষ্ট্য এবং সমতল আইটেমের মিশ্রণ রয়েছে, যেমন

public enum CommentType
{
    All = 1,
    Rent = 2,
    Insurance = 3,
    [Display(Name="Service Charge")]
    ServiceCharge = 4
}

তাই আমি অ্যাক্সেস করার চেষ্টা করার আগে কাস্টম বৈশিষ্ট্যগুলি পরীক্ষা করার জন্য কোডটিকে এতটা সামান্য সংশোধন করেছি এবং যদি কিছু না পাওয়া যায় তবে নামটি ব্যবহার করি।

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;

public static class EnumHelper<T>
{
    public static IList<T> GetValues(Enum value)
    {
        var enumValues = new List<T>();

        foreach (FieldInfo fi in value.GetType().GetFields(BindingFlags.Static | BindingFlags.Public))
        {
            enumValues.Add((T)Enum.Parse(value.GetType(), fi.Name, false));
        }
        return enumValues;
    }

    public static T Parse(string value)
    {
        return (T)Enum.Parse(typeof(T), value, true);
    }

    public static IList<string> GetNames(Enum value)
    {
        return value.GetType().GetFields(BindingFlags.Static | BindingFlags.Public).Select(fi => fi.Name).ToList();
    }

    public static IList<string> GetDisplayValues(Enum value)
    {
        return GetNames(value).Select(obj => GetDisplayValue(Parse(obj))).ToList();
    }

    private static string lookupResource(Type resourceManagerProvider, string resourceKey)
    {
        foreach (PropertyInfo staticProperty in resourceManagerProvider.GetProperties(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public))
        {
            if (staticProperty.PropertyType == typeof(System.Resources.ResourceManager))
            {
                System.Resources.ResourceManager resourceManager = (System.Resources.ResourceManager)staticProperty.GetValue(null, null);
                return resourceManager.GetString(resourceKey);
            }
        }

        return resourceKey; // Fallback with the key name
    }

    public static string GetDisplayValue(T value)
    {
        var fieldInfo = value.GetType().GetField(value.ToString());

        var descriptionAttributes = fieldInfo.GetCustomAttributes(
            typeof(DisplayAttribute), false) as DisplayAttribute[];

        if (descriptionAttributes.Any() && descriptionAttributes[0].ResourceType != null)
            return lookupResource(descriptionAttributes[0].ResourceType, descriptionAttributes[0].Name);

        if (descriptionAttributes == null) return string.Empty;
        return (descriptionAttributes.Length > 0) ? descriptionAttributes[0].Name : value.ToString();
    }
}

0

এমভিসি 5 ব্যবহার করে আপনি ব্যবহার করতে পারেন:

public enum UserPromotion
{
   None = 0x0,

   [Display(Name = "Send Job Offers By Mail")]
   SendJobOffersByMail = 0x1,

   [Display(Name = "Send Job Offers By Sms")]
   SendJobOffersBySms = 0x2,

   [Display(Name = "Send Other Stuff By Sms")]
   SendPromotionalBySms = 0x4,

   [Display(Name = "Send Other Stuff By Mail")]
   SendPromotionalByMail = 0x8
}

তারপরে আপনি যদি ড্রপডাউন সিলেক্টর তৈরি করতে চান তবে আপনি ব্যবহার করতে পারেন:

@Html.EnumDropdownListFor(expression: model => model.PromotionSelector, optionLabel: "Select") 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.