C # में एक स्ट्रिंग को एनम में बदलें


894

C # में एन्यूमरेशन वैल्यू में स्ट्रिंग को कन्वर्ट करने का सबसे अच्छा तरीका क्या है?

मेरे पास एक HTML चुनिंदा टैग है जिसमें एक एन्यूमरेशन का मान है। जब पृष्ठ पोस्ट किया जाता है, तो मैं मूल्य (जो एक स्ट्रिंग के रूप में होगा) को चुनना चाहता हूं और इसे एन्हांसमेंट मान में परिवर्तित करता हूं।

एक आदर्श दुनिया में, मैं कुछ ऐसा कर सकता था:

StatusEnum MyStatus = StatusEnum.Parse("Active");

लेकिन यह एक वैध कोड नहीं है।

जवाबों:


1507

.NET कोर और .NET> 4 में एक सामान्य पार्स विधि है :

Enum.TryParse("Active", out StatusEnum myStatus);

इसमें C # 7 के नए इनलाइन outवैरिएबल भी शामिल हैं , इसलिए यह ट्राइ-पार्स, स्पष्ट एनम टाइप में रूपांतरण और myStatusवैरिएबल + को इनिशियलाइज़ करता है।

यदि आपके पास C # 7 और नवीनतम .NET तक पहुंच है, तो यह सबसे अच्छा तरीका है।

मूल उत्तर

.NET में यह बदसूरत है (जब तक कि 4 या उससे अधिक न हो):

StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true);

मैं इसे सरल बनाता हूं:

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

तब मैं कर सकता हूँ:

StatusEnum MyStatus = EnumUtil.ParseEnum<StatusEnum>("Active");

टिप्पणियों में सुझाया गया एक विकल्प एक एक्सटेंशन जोड़ना है, जो पर्याप्त सरल है:

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

StatusEnum MyStatus = "Active".ToEnum<StatusEnum>();

अंत में, यदि स्ट्रिंग को पार्स नहीं किया जा सकता है, तो आप एक डिफ़ॉल्ट एनुम का उपयोग करना चाहते हैं:

public static T ToEnum<T>(this string value, T defaultValue) 
{
    if (string.IsNullOrEmpty(value))
    {
        return defaultValue;
    }

    T result;
    return Enum.TryParse<T>(value, true, out result) ? result : defaultValue;
}

जो यह कॉल करता है:

StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);

हालाँकि, मैं इस तरह से string(बिना नाम पते के नियंत्रण के) के रूप में एक विस्तार विधि जोड़ने में सावधान रहूंगा, यह सभी उदाहरणों पर दिखाई देगा stringकि क्या वे एक एनम पकड़ते हैं या नहीं (इसलिए 1234.ToString().ToEnum(StatusEnum.None)यह मान्य लेकिन निरर्थक होगा)। Microsoft के मुख्य वर्गों को अतिरिक्त तरीकों से अव्यवस्थित करने से बचने के लिए अक्सर सबसे अच्छा होता है जो केवल बहुत विशिष्ट संदर्भों में लागू होते हैं जब तक कि आपके संपूर्ण विकास दल को उन एक्सटेंशनों की बहुत अच्छी समझ न हो।


17
यदि प्रदर्शन महत्वपूर्ण है (जो हमेशा होता है) नीचे दिए गए Mckenzieg1 द्वारा दिए गए chk उत्तर: stackoverflow.com/questions/16100/…
नैश

28
@avinashr @ McKenzieG1 के उत्तर के बारे में सही है, लेकिन यह हमेशा महत्वपूर्ण नहीं है। उदाहरण के लिए, एनम परसिंग की चिंता करना एक व्यर्थ सूक्ष्म अनुकूलन होगा यदि आप प्रत्येक पार्स के लिए डीबी कॉल कर रहे हैं।
कीथ

4
@ मुझे नहीं लगता कि एक एक्सटेंशन यहां उपयुक्त है - यह एक विशेष मामले का एक सा है और एक एक्सटेंशन हर स्ट्रिंग पर लागू होगा । यदि आप वास्तव में इसे करना चाहते हैं, तो यह एक तुच्छ परिवर्तन होगा।
कीथ

7
Enum.TryParse के बारे में कैसे?
एलेन

15
बहुत अच्छा। आपको अपने अंतिम उदाहरण में जहां T: संरचना की आवश्यकता है।
बब्रिक

330

उपयोग Enum.TryParse<T>(String, T)(≥ .NET 4.0):

StatusEnum myStatus;
Enum.TryParse("Active", out myStatus);

इसे C # 7.0 के पैरामीटर टाइप इनलाइनिंग के साथ और भी सरल बनाया जा सकता है :

Enum.TryParse("Active", out StatusEnum myStatus);

45
केस-सेंसिटिविटी के लिए मध्य बूलियन पैरामीटर जोड़ें और यह अब तक का सबसे सुरक्षित और सबसे सुंदर समाधान है।
DanM7

18
आइए, आप में से कितने लोगों ने 2008 से चयनित उत्तर को लागू किया है और केवल स्क्रॉल करें और यह बेहतर (आधुनिक) उत्तर है।
TEK

@ मैं वास्तव में 2008 के उत्तर को पसंद करता हूं।
ज़ीरो 3

मुझे नहीं मिला। Parseरूपांतरण के साथ जो कुछ गलत हुआ, उसके लिए व्याख्यात्मक अपवाद फेंकता है (मान nullखाली था , या कोई समान एनम स्थिरांक), जो कि TryParse's बूलियन रिटर्न वैल्यू (जो ठोस त्रुटि को
दबाती है

2
Enum.TryParse <T> (स्ट्रिंग, T) पूर्णांक स्ट्रिंग्स को पार्स करते समय त्रुटिपूर्ण है। उदाहरण के लिए, यह कोड एक निरर्थक एनम के रूप में एक निरर्थक स्ट्रिंग को सफलतापूर्वक पार्स करेगा:var result = Enum.TryParse<System.DayOfWeek>("55", out var parsedEnum);
मास डॉट नेट

196

ध्यान दें कि प्रदर्शन Enum.Parse()भयानक है, क्योंकि यह प्रतिबिंब के माध्यम से कार्यान्वित किया जाता है। (वही सच है Enum.ToString, जो दूसरे तरीके से जाता है।)

यदि आपको प्रदर्शन-संवेदनशील कोड में स्ट्रिंग को धर्मांतरित करने की आवश्यकता है, तो आपका सबसे अच्छा शर्त एक Dictionary<String,YourEnum>स्टार्टअप बनाना और उसका रूपांतरण करने के लिए उपयोग करना है।


10
मैंने एक डेस्कटॉप कंप्यूटर पर पहले रन के लिए एक स्ट्रिंग को एनम में बदलने के लिए 3ms मापा है। (सिर्फ उद्वेग के स्तर को स्पष्ट करने के लिए)।
मैथ्यू चारबोनियर

12
वाह 3ms भयानक के परिमाण का आदेश है
जॉन स्टॉक

1
आप इस के चारों ओर एक कोड नमूना जोड़ सकते हैं, तो हम कैसे को बदलने के लिए और उपयोग पर एक विचार प्राप्त
ट्रांसफार्मर

यदि आपका ऐप 1 मिलियन लोगों द्वारा उपयोग किया जाता है => यह आपके द्वारा उपभोग किए जा रहे 50 घंटे के मानव जीवन को जोड़ता है :) एक पृष्ठ-उपयोग पर। : P
Cătălin Rădoi


31

अब आप एक्सटेंशन विधियों का उपयोग कर सकते हैं:

public static T ToEnum<T>(this string value, bool ignoreCase = true)
{
    return (T) Enum.Parse(typeof (T), value, ignoreCase);
}

और आप उन्हें नीचे दिए गए कोड द्वारा कॉल कर सकते हैं (यहां, FilterTypeएक एनम प्रकार है):

FilterType filterType = type.ToEnum<FilterType>();

1
मैंने इसे मूल्य के रूप में वस्तु के रूप में लेने और इसे इस विधि के अंदर स्ट्रिंग करने के लिए अद्यतन किया है। इस तरह मैं एक int value ले सकता हूँ। केवल तार के बजाय।
RealSollyM

2
@SollyM मैं कहूंगा कि यह एक भयानक विचार कारण है, फिर यह विस्तार विधि सभी ऑब्जेक्ट प्रकारों पर लागू होगी । दो विस्तार विधियां, एक स्ट्रिंग के लिए और एक इंट के लिए, मेरी राय में क्लीनर और अधिक सुरक्षित होगी।
संवत्

@ सविश, यह सच है। ऐसा करने का एकमात्र कारण यह है कि हमारे कोड का उपयोग केवल आंतरिक रूप से किया जाता है और मैं 2 एक्सटेंशन लिखने से बचना चाहता था। और जब से हम एनुम में परिवर्तित होते हैं, केवल उसी समय स्ट्रिंग या इंट के साथ होता है, मैंने नहीं देखा कि यह एक समस्या है।
RealSollyM

3
@SollyM आंतरिक या नहीं, मैं अभी भी अपने कोड को बनाए रखने और उपयोग कर रहा हूं: यदि मैं प्रत्येक इंटेलीजेंस मेनू में एक ToEnum उठता हूं, तो PI नाराज हो जाएगा, और जैसा कि आप कहते हैं, जब से आप एक एनम में कनवर्ट करते हैं, तब से आप स्ट्रिंग में हैं या int, आपको पूरा यकीन है कि आपको केवल उन दो तरीकों की आवश्यकता होगी। और दो विधियाँ एक से अधिक नहीं हैं, खासकर जब वे इस प्रकार के होते हैं और उपयोगिता के प्रकार: P
Svish

20
object Enum.Parse(System.Type enumType, string value, bool ignoreCase);

तो अगर आपके पास मूड नाम की कोई एनम होती तो ऐसा दिखता:

   enum Mood
   {
      Angry,
      Happy,
      Sad
   } 

   // ...
   Mood m = (Mood) Enum.Parse(typeof(Mood), "Happy", true);
   Console.WriteLine("My mood is: {0}", m.ToString());

18

सावधान:

enum Example
{
    One = 1,
    Two = 2,
    Three = 3
}

Enum.(Try)Parse() एकाधिक, अल्पविराम से अलग किए गए तर्कों को स्वीकार करता है, और उन्हें बाइनरी या 'के साथ जोड़ता है| । आप इसे अक्षम नहीं कर सकते और मेरी राय में आप इसे कभी नहीं चाहते।

var x = Enum.Parse("One,Two"); // x is now Three

यहां तक ​​कि अगर Threeपरिभाषित नहीं किया गया था, xतब भी उन्हें अंतर मूल्य मिलेगा 3। यह और भी बुरा है: Enum.Parse () आपको एक मान दे सकता है जो कि एनम के लिए भी परिभाषित नहीं है!

मैं स्वेच्छा से या अनिच्छा से, इस व्यवहार को ट्रिगर करते हुए, उपयोगकर्ताओं के परिणामों का अनुभव नहीं करना चाहता।

इसके अतिरिक्त, जैसा कि दूसरों ने उल्लेख किया है, प्रदर्शन बड़ी संख्याओं के लिए आदर्श से कम है, अर्थात् संभावित मूल्यों की संख्या में रैखिक।

मैं निम्नलिखित सुझाव देता हूं:

    public static bool TryParse<T>(string value, out T result)
        where T : struct
    {
        var cacheKey = "Enum_" + typeof(T).FullName;

        // [Use MemoryCache to retrieve or create&store a dictionary for this enum, permanently or temporarily.
        // [Implementation off-topic.]
        var enumDictionary = CacheHelper.GetCacheItem(cacheKey, CreateEnumDictionary<T>, EnumCacheExpiration);

        return enumDictionary.TryGetValue(value.Trim(), out result);
    }

    private static Dictionary<string, T> CreateEnumDictionary<T>()
    {
        return Enum.GetValues(typeof(T))
            .Cast<T>()
            .ToDictionary(value => value.ToString(), value => value, StringComparer.OrdinalIgnoreCase);
    }

4
वास्तव में यह जानना बहुत उपयोगी है Enum.(Try)Parse accepts multiple, comma-separated arguments, and combines them with binary 'or'। इसका मतलब है कि आप अपने एनम मूल्यों को 2 की शक्तियों के रूप में स्थापित कर सकते हैं और आपके पास कई बूलियन झंडे, उदाहरण के लिए पार्स करने का एक बहुत आसान तरीका है। "UseSSL, NoRetries, समन्वयन"। वास्तव में यह शायद यही है कि इसके लिए डिज़ाइन किया गया था।
pcdev


13

अपवादों से बचने के लिए आप डिफ़ॉल्ट मान के साथ स्वीकृत उत्तर का विस्तार कर सकते हैं:

public static T ParseEnum<T>(string value, T defaultValue) where T : struct
{
    try
    {
        T enumValue;
        if (!Enum.TryParse(value, true, out enumValue))
        {
            return defaultValue;
        }
        return enumValue;
    }
    catch (Exception)
    {
        return defaultValue;
    }
}

तब आप इसे कहते हैं:

StatusEnum MyStatus = EnumUtil.ParseEnum("Active", StatusEnum.None);

यदि डिफ़ॉल्ट मान Enum नहीं है तो Enum.TryParse विफल हो जाएगा और एक अपवाद फेंक देगा जो पकड़ा गया है।

कई स्थानों पर हमारे कोड में इस फ़ंक्शन का उपयोग करने के वर्षों के बाद, शायद यह जानकारी जोड़ना अच्छा है कि इस ऑपरेशन में प्रदर्शन की लागत है!


मुझे डिफ़ॉल्ट मान पसंद नहीं है। यह अप्रत्याशित परिणाम पैदा कर सकता है।
दानीलाल

5
यह अपवाद कब फेंकेगा?
andleer 28'16

@andleer अगर एनम मान डिफॉल्ट मान के समान एनम प्रकार के लिए फिट नहीं है
नेल्ली

@ यहाँ पुराना कोड है लेकिन defaultValueऔर विधि वापसी प्रकार दोनों प्रकार के हैं T। यदि प्रकार भिन्न हैं, तो आपको एक संकलन समय त्रुटि प्राप्त होगी: "ConsoleApp1.Size 'से' ConsoleApp1.Color 'में परिवर्तित नहीं किया जा सकता है" या आपके जो भी प्रकार हैं।
andleer

@andleer, मुझे क्षमा करें, मेरा अंतिम उत्तर आपके लिए सही नहीं था। यह संभव है कि यह विधि उस मामले में एक Syste.ArgumentException को फेंकता है जो कोई व्यक्ति इस फ़ंक्शन को डिफ़ॉल्ट मान के साथ कहता है जो कि प्रकार का नहीं है। C # 7.0 के साथ मैं T: Enum का एक खंड नहीं बना सका। यही कारण है कि मैंने एक कोशिश के साथ इस कब्जे को पकड़ लिया।
नेली

8

हम पूरी तरह से मान्य इनपुट को स्वीकार नहीं कर सके और @ कीथ के उत्तर की इस भिन्नता के साथ गए:

public static TEnum ParseEnum<TEnum>(string value) where TEnum : struct
{
    TEnum tmp; 
    if (!Enum.TryParse<TEnum>(value, true, out tmp))
    {
        tmp = new TEnum();
    }
    return tmp;
}


5

.NET 4.5 से पार्स स्ट्रिंग को कोशिश / कैच और बिना ट्रायपार्से () विधि के बिना

/// <summary>
/// Parses string to TEnum without try/catch and .NET 4.5 TryParse()
/// </summary>
public static bool TryParseToEnum<TEnum>(string probablyEnumAsString_, out TEnum enumValue_) where TEnum : struct
{
    enumValue_ = (TEnum)Enum.GetValues(typeof(TEnum)).GetValue(0);
    if(!Enum.IsDefined(typeof(TEnum), probablyEnumAsString_))
        return false;

    enumValue_ = (TEnum) Enum.Parse(typeof(TEnum), probablyEnumAsString_);
    return true;
}

1
क्या यह आवश्यक है कि यदि कोड में पहले से ही एक विवरण है, तो उसका विवरण देना आवश्यक है? ठीक है, मैंने यह किया है :)
jite.gs

3

TryParse का उपयोग करके सुपर सरल कोड:

var value = "Active";

StatusEnum status;
if (!Enum.TryParse<StatusEnum>(value, out status))
    status = StatusEnum.Unknown;

2

मैं विस्तार विधि समाधान की तरह ..

namespace System
{
    public static class StringExtensions
    {

        public static bool TryParseAsEnum<T>(this string value, out T output) where T : struct
        {
            T result;

            var isEnum = Enum.TryParse(value, out result);

            output = isEnum ? result : default(T);

            return isEnum;
        }
    }
}

यहाँ परीक्षणों के साथ मेरे कार्यान्वयन के नीचे।

using static Microsoft.VisualStudio.TestTools.UnitTesting.Assert;
using static System.Console;

private enum Countries
    {
        NorthAmerica,
        Europe,
        Rusia,
        Brasil,
        China,
        Asia,
        Australia
    }

   [TestMethod]
        public void StringExtensions_On_TryParseAsEnum()
        {
            var countryName = "Rusia";

            Countries country;
            var isCountry = countryName.TryParseAsEnum(out country);

            WriteLine(country);

            IsTrue(isCountry);
            AreEqual(Countries.Rusia, country);

            countryName = "Don't exist";

            isCountry = countryName.TryParseAsEnum(out country);

            WriteLine(country);

            IsFalse(isCountry);
            AreEqual(Countries.NorthAmerica, country); // the 1rst one in the enumeration
        }

1
public static T ParseEnum<T>(string value)            //function declaration  
{
    return (T) Enum.Parse(typeof(T), value);
}

Importance imp = EnumUtil.ParseEnum<Importance>("Active");   //function call

==================== एक पूरा कार्यक्रम ==================

using System;

class Program
{
    enum PetType
    {
    None,
    Cat = 1,
    Dog = 2
    }

    static void Main()
    {

    // Possible user input:
    string value = "Dog";

    // Try to convert the string to an enum:
    PetType pet = (PetType)Enum.Parse(typeof(PetType), value);

    // See if the conversion succeeded:
    if (pet == PetType.Dog)
    {
        Console.WriteLine("Equals dog.");
    }
    }
}
-------------
Output

Equals dog.

1

मैंने क्लास (दृढ़ता से टाइप किए गए संस्करण और पार्सिंग और प्रदर्शन में सुधार के साथ Enum) का उपयोग किया। मुझे यह GitHub पर मिला, और इसे .NET 3.5 के लिए भी काम करना चाहिए। यह कुछ स्मृति उपरि है क्योंकि यह एक शब्दकोश बफ़र करता है।

StatusEnum MyStatus = Enum<StatusEnum>.Parse("Active");

ब्लॉगपोस्ट Enums है - बेहतर सिंटैक्स, बेहतर प्रदर्शन और NET 3.5 में TryParse

और कोड: https://github.com/damieng/DamienGKit/blob/master/CSharp/DamienG.Library/System/EnumT.cs


1

प्रदर्शन के लिए यह मदद कर सकता है:

    private static Dictionary<Type, Dictionary<string, object>> dicEnum = new Dictionary<Type, Dictionary<string, object>>();
    public static T ToEnum<T>(this string value, T defaultValue)
    {
        var t = typeof(T);
        Dictionary<string, object> dic;
        if (!dicEnum.ContainsKey(t))
        {
            dic = new Dictionary<string, object>();
            dicEnum.Add(t, dic);
            foreach (var en in Enum.GetValues(t))
                dic.Add(en.ToString(), en);
        }
        else
            dic = dicEnum[t];
        if (!dic.ContainsKey(value))
            return defaultValue;
        else
            return (T)dic[value];
    }

1

मैंने पाया कि यहाँ EnumMember मान वाले Enum मानों के मामले पर विचार नहीं किया गया था। तो अब हम शुरू करें:

using System.Runtime.Serialization;

public static TEnum ToEnum<TEnum>(this string value, TEnum defaultValue) where TEnum : struct
{
    if (string.IsNullOrEmpty(value))
    {
        return defaultValue;
    }

    TEnum result;
    var enumType = typeof(TEnum);
    foreach (var enumName in Enum.GetNames(enumType))
    {
        var fieldInfo = enumType.GetField(enumName);
        var enumMemberAttribute = ((EnumMemberAttribute[]) fieldInfo.GetCustomAttributes(typeof(EnumMemberAttribute), true)).FirstOrDefault();
        if (enumMemberAttribute?.Value == value)
        {
            return Enum.TryParse(enumName, true, out result) ? result : defaultValue;
        }
    }

    return Enum.TryParse(value, true, out result) ? result : defaultValue;
}

और उस एनम का उदाहरण:

public enum OracleInstanceStatus
{
    Unknown = -1,
    Started = 1,
    Mounted = 2,
    Open = 3,
    [EnumMember(Value = "OPEN MIGRATE")]
    OpenMigrate = 4
}

1

Enum से ऑब्जेक्ट वैल्यू प्राप्त करने के लिए आपको Enum.Parse का उपयोग करना होगा, उसके बाद आपको ऑब्जेक्ट वैल्यू को विशिष्ट एनम वैल्यू में बदलना होगा। Enum मान पर कास्टिंग Convert.ChangeType का उपयोग करके किया जा सकता है। कृपया निम्नलिखित स्निपेट पर एक नज़र डालें

public T ConvertStringValueToEnum<T>(string valueToParse){
    return Convert.ChangeType(Enum.Parse(typeof(T), valueToParse, true), typeof(T));
}

1

इस नमूने की कोशिश करें:

 public static T GetEnum<T>(string model)
    {
        var newModel = GetStringForEnum(model);

        if (!Enum.IsDefined(typeof(T), newModel))
        {
            return (T)Enum.Parse(typeof(T), "None", true);
        }

        return (T)Enum.Parse(typeof(T), newModel.Result, true);
    }

    private static Task<string> GetStringForEnum(string model)
    {
        return Task.Run(() =>
        {
            Regex rgx = new Regex("[^a-zA-Z0-9 -]");
            var nonAlphanumericData = rgx.Matches(model);
            if (nonAlphanumericData.Count < 1)
            {
                return model;
            }
            foreach (var item in nonAlphanumericData)
            {
                model = model.Replace((string)item, "");
            }
            return model;
        });
    }

इस नमूने में आप प्रत्येक स्ट्रिंग भेज सकते हैं, और अपना सेट कर सकते हैं Enum। यदि आपके Enumपास वह डेटा है जो आप चाहते थे, तो उसे अपने Enumप्रकार के रूप में वापस करें ।


1
आप newModelप्रत्येक पंक्ति पर ओवरराइट कर रहे हैं , इसलिए यदि इसमें डैश हैं, तो इसे प्रतिस्थापित नहीं किया जाएगा। इसके अलावा, आपको यह जांचने की ज़रूरत नहीं है कि क्या स्ट्रिंग में कुछ भी है, आप बस Replaceवैसे भी कॉल कर सकते हैं :var newModel = model.Replace("-", "").Replace(" ", "");
लार्स क्रिस्टेंसन

@LarsKristensen हाँ हम एक ऐसा तरीका बना सकते हैं जो नॉनफ्लुमेरिक चरित्र को हटा दे।
अमीरजे-फ़राहलगाह

1

निश्चित नहीं है कि यह कब जोड़ा गया था, लेकिन एनम वर्ग पर अब ए है

Parse<TEnum>(stringValue)

प्रश्न में उदाहरण के साथ प्रयोग किया जाता है:

var MyStatus = Enum.Parse<StatusEnum >("Active")

या आवरण को अनदेखा करना:

var MyStatus = Enum.Parse<StatusEnum >("active", true)

यहाँ विघटित विधियों का उपयोग किया गया है:

    [NullableContext(0)]
    public static TEnum Parse<TEnum>([Nullable(1)] string value) where TEnum : struct
    {
      return Enum.Parse<TEnum>(value, false);
    }

    [NullableContext(0)]
    public static TEnum Parse<TEnum>([Nullable(1)] string value, bool ignoreCase) where TEnum : struct
    {
      TEnum result;
      Enum.TryParse<TEnum>(value, ignoreCase, true, out result);
      return result;
    }

0
        <Extension()>
    Public Function ToEnum(Of TEnum)(ByVal value As String, ByVal defaultValue As TEnum) As TEnum
        If String.IsNullOrEmpty(value) Then
            Return defaultValue
        End If

        Return [Enum].Parse(GetType(TEnum), value, True)
    End Function

0
public TEnum ToEnum<TEnum>(this string value, TEnum defaultValue){
if (string.IsNullOrEmpty(value))
    return defaultValue;

return Enum.Parse(typeof(TEnum), value, true);}

0

यदि संपत्ति का नाम उस चीज़ से अलग है जिसे आप इसे (यानी भाषा अंतर) कहना चाहते हैं, तो आप ऐसा कर सकते हैं:

MyType.cs

using System;
using System.Runtime.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

[JsonConverter(typeof(StringEnumConverter))]
public enum MyType
{
    [EnumMember(Value = "person")]
    Person,
    [EnumMember(Value = "annan_deltagare")]
    OtherPerson,
    [EnumMember(Value = "regel")]
    Rule,
}

EnumExtensions.cs

using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

public static class EnumExtensions
{
    public static TEnum ToEnum<TEnum>(this string value) where TEnum : Enum
    {
        var jsonString = $"'{value.ToLower()}'";
        return JsonConvert.DeserializeObject<TEnum>(jsonString, new StringEnumConverter());
    }

    public static bool EqualsTo<TEnum>(this string strA, TEnum enumB) where TEnum : Enum
    {
        TEnum enumA;
        try
        {
            enumA = strA.ToEnum<TEnum>();
        }
        catch
        {
            return false;
        }
        return enumA.Equals(enumB);
    }
}

Program.cs

public class Program
{
    static public void Main(String[] args) 
    { 
        var myString = "annan_deltagare";
        var myType = myString.ToEnum<MyType>();
        var isEqual = myString.EqualsTo(MyType.OtherPerson);
        //Output: true
    }     
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.