स्ट्रिंग मान के साथ एक एनम कैसे परिभाषित करें?


97

मैं एक Enumसामान्य कॉमन सेपरेटर को परिभाषित करने और जोड़ने की कोशिश कर रहा हूं जो सीएसवी या इसी तरह की फाइलों में इस्तेमाल होता है। फिर मैं इसे ComboBoxएक डेटा स्रोत के रूप में बाँधने जा रहा हूँ ताकि जब भी मैं Enum परिभाषा से जोड़ूँ या निकालूँ, मुझे कॉम्बो बॉक्स में कुछ भी बदलने की आवश्यकता नहीं होगी।

समस्या यह है कि मैं स्ट्रिंग प्रतिनिधित्व के साथ एनम को कैसे परिभाषित कर सकता हूं, जैसे कुछ:

public enum SeparatorChars{Comma = ",", Tab = "\t", Space = " "}


जवाबों:


112

आप नहीं कर सकते हैं - एनम मान का अभिन्न मान होना चाहिए। आप या तो प्रत्येक एनुम मान के साथ एक स्ट्रिंग मान को जोड़ने के लिए विशेषताओं का उपयोग कर सकते हैं, या इस मामले में यदि प्रत्येक विभाजक एक एकल वर्ण है तो आप केवल charमूल्य का उपयोग कर सकते हैं :

enum Separator
{
    Comma = ',',
    Tab = '\t',
    Space = ' '
}

(संपादित करें: केवल स्पष्ट करने के लिए, आप charअंतर्निहित प्रकार के एनम को नहीं बना सकते हैं , लेकिन आप charप्रत्येक एनम मान के अनुरूप अभिन्न मान निर्दिष्ट करने के लिए स्थिरांक का उपयोग कर सकते हैं । उपरोक्त एनम का अंतर्निहित प्रकार है int।)

यदि आपको एक की आवश्यकता है तो एक विस्तार विधि:

public string ToSeparatorString(this Separator separator)
{
    // TODO: validation
    return ((char) separator).ToString();
}

Enums में चार मान्य नहीं है। Msdn: "प्रत्येक गणन प्रकार में एक अंतर्निहित प्रकार होता है, जो चार को छोड़कर किसी भी प्रकार का अभिन्न अंग हो सकता है।"
dowhilefor

8
@ सान्द्रहेल्फ़: आप मेरे जवाब के अनुसार, मूल्य के लिए एक शाब्दिक शब्द का उपयोग कर सकते हैं । मैंने इसका परीक्षण किया :)
जॉन स्कीट

चूंकि यह आवश्यकता फाइलों के लिए होती है, उपयोगकर्ता को CRLF विभाजक की आवश्यकता हो सकती है। क्या यह उस मामले के लिए भी काम करेगा?
महीप

धन्यवाद जॉन, एक चार के रूप में मायने नहीं रखता है ?!
सईद यज़दानी

1
@ शॉन लुट्टिन: एनम केवल "नामित संख्या" हैं - इसलिए एक स्ट्रिंग एनम वास्तव में उस मॉडल के साथ बिल्कुल भी फिट नहीं है।
जॉन स्कीट

82

जहां तक ​​मुझे पता है, आपको एनम को स्ट्रिंग मान निर्दिष्ट करने की अनुमति नहीं दी जाएगी। आप जो कर सकते हैं, उसमें स्ट्रिंग स्थिरांक के साथ एक वर्ग बनाएं।

public static class SeparatorChars
{
    public static String Comma { get { return ",";} } 
    public static String Tab { get { return "\t,";} } 
    public static String Space { get { return " ";} } 
}

9
दूसरों के विपरीत इस दृष्टिकोण के नीचे यह है कि आप कुछ अतिरिक्त / विशेष किए बिना इनकी गणना नहीं कर सकते।
caesay

यह संकलन समय के दौरान कुछ मानों को लागू करने में मदद नहीं करता है, क्योंकि separatorअब Separatorप्रतिबंधित मान्य मूल्यों के साथ एक प्रकार के बजाय एक स्ट्रिंग (कुछ भी हो सकता है) है।
चिकनफेट

71

आप इसे प्राप्त कर सकते हैं लेकिन काम की आवश्यकता होगी।

  1. एक विशेषता वर्ग को परिभाषित करें जिसमें Enum के लिए स्ट्रिंग मान होगा।
  2. एक विस्तार विधि को परिभाषित करें जो विशेषता से मान वापस कर देगा। Eg..GetStringValue (यह Enum मान) विशेषता मान लौटाएगा।
  3. तब आप इस तरह से दुश्मनी को परिभाषित कर सकते हैं।
पब्लिक एनम टेस्ट: इंट {
    [StringValue ( "एक")]
    फू = 1,
    [StringValue ( "बी")]
    कुछ = २        
} 
  1. Attrinbute Test.Foo.GetStringValue () से मान वापस पाने के लिए;

देखें: सी # में स्ट्रिंग वैल्यू के साथ एनम


4
मैं इस पुराने को जानता हूं, लेकिन यह स्पष्ट रूप से अद्वितीय है और आपको DB में कोड और स्ट्रिंग मान में एनम का उपयोग करने की अनुमति देता है। अद्भुत
A_kat

1
एक और देर से टिप्पणी, लेकिन यह वास्तव में एक शानदार समाधान है
एलन

35

स्ट्रिंग मानों (या किसी अन्य प्रकार) के सरल एनुम के लिए:

public static class MyEnumClass
{
    public const string 
        MyValue1 = "My value 1",
        MyValue2 = "My value 2";
}

उपयोग: string MyValue = MyEnumClass.MyValue1;


1
हालांकि यह एक एनम नहीं है, मुझे लगता है कि यह उपयोगकर्ता को क्या करने की कोशिश कर रहा है इसका सबसे अच्छा समाधान प्रदान कर सकता है। कभी-कभी, सबसे सरल समाधान सबसे अच्छा है।
Zesty

28

आप इसे एनम के साथ नहीं कर सकते हैं, लेकिन आप इसे इस तरह कर सकते हैं:

public static class SeparatorChars
{
    public static string Comma = ",";

    public static string Tab = "\t";

    public static string Space = " ";
}

1
+1 जबकि मुझे लगता है कि यह सही समाधान है, मैं कक्षा का नाम बदल दूंगा या टाइप को चार्ट में बदल दूंगा। बस सुसंगत होना है।
dowhilefor

धन्यवाद, क्या आप बता सकते हैं कि comboBox.DataSource = Enum.GetValues(typeof(myEnum));इस मामले में क्या बराबर होगा ?
सईद यज़दानी

1
@ Sean87: मैं चाहता हूं कि आप, मैं जोन्स्केकेट्स का जवाब दूंगा।
फिश्चरमाेंन

मुझे लगता है कि यह लगभग सही उत्तर है, क्योंकि यह switch-caseब्लॉक के अंदर प्रयोग करने योग्य नहीं है । खेतों को constक्रम में होना चाहिए । यदि आप चाहते हैं लेकिन यह अभी भी मदद नहीं की जा सकती Enum.GetValues(typeof(myEnum))
आंद्रे संतालो

7
के constबदले मैं उपयोग करूंगा static। स्थिरांक केवल पढ़ने के साथ-साथ स्थैतिक भी होते हैं और कंस्ट्रक्टरों (जब तक कि आसानी से खेतों में) में नहीं होते हैं।
ओलिवियर जैकोट-डेसकोम्बर्स

12

आप नहीं कर सकते, क्योंकि एनम केवल एक आदिम संख्यात्मक प्रकार पर आधारित हो सकता है। आप Dictionaryइसके बजाय प्रयोग करके देख सकते हैं :

Dictionary<String, char> separators = new Dictionary<string, char>
{
    {"Comma", ','}, 
    {"Tab",  '\t'}, 
    {"Space", ' '},
};

वैकल्पिक रूप से, आप एक का उपयोग कर सकते हैं Dictionary<Separator, char>या Dictionary<Separator, string>जहां Separatorएक सामान्य दुश्मनी है:

enum Separator
{
    Comma,
    Tab,
    Space
}

जो सीधे तारों को संभालने की तुलना में थोड़ा अधिक सुखद होगा।


11

एक वर्ग जो एनम व्यवहार का अनुकरण करता है, लेकिन stringइसके बजाय का उपयोग करके intबनाया जा सकता है ...

public class GrainType
{
    private string _typeKeyWord;

    private GrainType(string typeKeyWord)
    {
        _typeKeyWord = typeKeyWord;
    }

    public override string ToString()
    {
        return _typeKeyWord;
    }

    public static GrainType Wheat = new GrainType("GT_WHEAT");
    public static GrainType Corn = new GrainType("GT_CORN");
    public static GrainType Rice = new GrainType("GT_RICE");
    public static GrainType Barley = new GrainType("GT_BARLEY");

}

प्रयोग ...

GrainType myGrain = GrainType.Wheat;

PrintGrainKeyword(myGrain);

फिर...

public void PrintGrainKeyword(GrainType grain) 
{
    Console.Writeline("My Grain code is " + grain.ToString());   // Displays "My Grain code is GT_WHEAT"
}

GrainType myGrain = "GT_CORN"उदाहरण के लिए, केवल एक चीज आप ऐसा नहीं कर सकते ।
बृहस्पतिवार

यदि आप ऑपरेटर
से आगे निकल सकते हैं

8

यह उत्तर के लिए देर से है, लेकिन शायद यह भविष्य में किसी की मदद करे। मुझे इस तरह की समस्या के लिए संरचना का उपयोग करना आसान लगा।

निम्नलिखित नमूने को एमएस कोड से चिपकाया हुआ भाग है:

namespace System.IdentityModel.Tokens.Jwt
{
    //
    // Summary:
    //     List of registered claims from different sources http://tools.ietf.org/html/rfc7519#section-4
    //     http://openid.net/specs/openid-connect-core-1_0.html#IDToken
    public struct JwtRegisteredClaimNames
    {
        //
        // Summary:
        //     http://tools.ietf.org/html/rfc7519#section-4
        public const string Actort = "actort";
        //
        // Summary:
        //     http://tools.ietf.org/html/rfc7519#section-4
        public const string Typ = "typ";
        //
        // Summary:
        //     http://tools.ietf.org/html/rfc7519#section-4
        public const string Sub = "sub";
        //
        // Summary:
        //     http://openid.net/specs/openid-connect-frontchannel-1_0.html#OPLogout
        public const string Sid = "sid";
        //
        // Summary:
        //     http://tools.ietf.org/html/rfc7519#section-4
        public const string Prn = "prn";
        //
        // Summary:
        //     http://tools.ietf.org/html/rfc7519#section-4
        public const string Nbf = "nbf";
        //
        // Summary:
        //     http://tools.ietf.org/html/rfc7519#section-4
        public const string Nonce = "nonce";
        //
        // Summary:
        //     http://tools.ietf.org/html/rfc7519#section-4
        public const string NameId = "nameid";

    }
}

क्या आप बता सकते हैं कि क्लास का उपयोग करने की तुलना में यह एप्रोच बेहतर क्यों है?
गेरार्डो ग्रिग्नोली

@GerardoGrignoli मुझे बिल्कुल नहीं पता कि वे इस तरह की चीज़ के लिए एमएस में क्लास के बजाय स्ट्रक्चर का उपयोग क्यों करते हैं। मैंने यह जानने की कोशिश भी नहीं की, क्योंकि यह पूरी तरह से मेरे लिए काम कर रहा है। शायद स्टैक पर यहां सवाल पूछने की कोशिश करें ...
21

5

अधिक सामान्य प्रश्न के उत्तर की तलाश में यहां पहुंचने वाले लोगों के लिए, यदि आप चाहते हैं कि आपका कोड एक जैसा दिखे तो आप स्थैतिक श्रेणी की अवधारणा का विस्तार कर सकते हैं enum

निम्नलिखित दृष्टिकोण काम करता है जब आपने अंतिम रूप से enum namesइच्छित नहीं किया है और enum valuesइसका stringप्रतिनिधित्व कर रहे हैं enam name; nameof()अपने रीफैक्टरिंग को सरल बनाने के लिए उपयोग करें।

public static class Colours
{
    public static string Red => nameof(Red);
    public static string Green => nameof(Green);
    public static string Blue => nameof(Blue);
}

यह एक एनम के इरादे को प्राप्त करता है जिसमें स्ट्रिंग मान होते हैं (जैसे निम्नलिखित स्यूडोकोड):

public enum Colours
{
    "Red",
    "Green",
    "Blue"
}

5

शायद यह बहुत देर हो चुकी है, लेकिन यहां यह हो जाता है।

हम Enum मान को प्रबंधित करने के लिए EnumMember के विशेषता का उपयोग कर सकते हैं।

public enum EUnitOfMeasure
{
    [EnumMember(Value = "KM")]
    Kilometer,
    [EnumMember(Value = "MI")]
    Miles
}

इस तरह EUnitOfMeasure के लिए परिणाम मान KM या MI होगा। यह एंड्रयू व्हिटकेकर के उत्तर में भी देखा जा सकता है ।


4

मैंने .NET में स्ट्रिंग-वैल्यू एनम बनाने के लिए बेस क्लास बनाया। यह सिर्फ एक सी # फ़ाइल है जिसे आप अपनी परियोजनाओं में कॉपी और पेस्ट कर सकते हैं, या स्ट्रिंगगैनम नामक नुगेट पैकेज के माध्यम से स्थापित कर सकते हैं ।

उपयोग:

///<completionlist cref="HexColor"/> 
class HexColor : StringEnum<HexColor>
{
    public static readonly HexColor Blue = New("#FF0000");
    public static readonly HexColor Green = New("#00FF00");
    public static readonly HexColor Red = New("#000FF");
}

विशेषताएं

  • आपका StringEnum कुछ हद तक एक नियमित enum जैसा दिखता है:
    // Static Parse Method
    HexColor.Parse("#FF0000") // => HexColor.Red
    HexColor.Parse("#ff0000", caseSensitive: false) // => HexColor.Red
    HexColor.Parse("invalid") // => throws InvalidOperationException

    // Static TryParse method.
    HexColor.TryParse("#FF0000") // => HexColor.Red
    HexColor.TryParse("#ff0000", caseSensitive: false) // => HexColor.Red
    HexColor.TryParse("invalid") // => null

    // Parse and TryParse returns the preexistent instances
    object.ReferenceEquals(HexColor.Parse("#FF0000"), HexColor.Red) // => true

    // Conversion from your `StringEnum` to `string`
    string myString1 = HexColor.Red.ToString(); // => "#FF0000"
    string myString2 = HexColor.Red; // => "#FF0000" (implicit cast)
  • अगर xml टिप्पणी के साथ वर्ग एनोटेट किया जाता है, तो Intellisense enum नाम का सुझाव देगा <completitionlist>। (C # और VB दोनों में काम करता है): यानी

Intellisense का डेमो

instalation

कोई एक:

  • नवीनतम स्ट्रिंगनम नूगेट पैकेज स्थापित करें , जो इस पर आधारित है .Net Standard 1.0ताकि यह .Net Core= = 1.0, .Net Framework> = 4.5, Mono> 4.6 /> आदि पर चले
  • या अपनी परियोजना के लिए निम्न स्ट्रिंग बेस क्लास को पेस्ट करें। ( नवीनतम संस्करण )
    public abstract class StringEnum<T> : IEquatable<T> where T : StringEnum<T>, new()
    {
        protected string Value;
        private static IList<T> valueList = new List<T>();
        protected static T New(string value)
        {
            if (value == null)
                return null; // the null-valued instance is null.

            var result = new T() { Value = value };
            valueList.Add(result);
            return result;
        }

        public static implicit operator string(StringEnum<T> enumValue) => enumValue.Value;
        public override string ToString() => Value;

        public static bool operator !=(StringEnum<T> o1, StringEnum<T> o2) => o1?.Value != o2?.Value;
        public static bool operator ==(StringEnum<T> o1, StringEnum<T> o2) => o1?.Value == o2?.Value;

        public override bool Equals(object other) => this.Value.Equals((other as T)?.Value ?? (other as string));
        bool IEquatable<T>.Equals(T other) => this.Value.Equals(other.Value);
        public override int GetHashCode() => Value.GetHashCode();

        /// <summary>
        /// Parse the <paramref name="value"/> specified and returns a valid <typeparamref name="T"/> or else throws InvalidOperationException.
        /// </summary>
        /// <param name="value">The string value representad by an instance of <typeparamref name="T"/>. Matches by string value, not by the member name.</param>
        /// <param name="caseSensitive">If true, the strings must match case sensitivity.</param>
        public static T Parse(string value, bool caseSensitive = false)
        {
            var result = TryParse(value, caseSensitive);
            if (result == null)
                throw new InvalidOperationException((value == null ? "null" : $"'{value}'") + $" is not a valid {typeof(T).Name}");

            return result;
        }

        /// <summary>
        /// Parse the <paramref name="value"/> specified and returns a valid <typeparamref name="T"/> or else returns null.
        /// </summary>
        /// <param name="value">The string value representad by an instance of <typeparamref name="T"/>. Matches by string value, not by the member name.</param>
        /// <param name="caseSensitive">If true, the strings must match case sensitivity.</param>
        public static T TryParse(string value, bool caseSensitive = false)
        {
            if (value == null) return null;
            if (valueList.Count == 0) System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(T).TypeHandle); // force static fields initialization
            var field = valueList.FirstOrDefault(f => f.Value.Equals(value,
                    caseSensitive ? StringComparison.Ordinal
                                  : StringComparison.OrdinalIgnoreCase));
            // Not using InvariantCulture because it's only supported in NETStandard >= 2.0

            if (field == null)
                return null;

            return field;
        }
    }
  • के लिए Newtonsoft.Jsonक्रमबद्धता समर्थन, बजाय इस विस्तारित संस्करण की नकल। StringEnum.cs

मुझे इस तथ्य के बाद एहसास हुआ कि यह कोड बेन के जवाब के समान है। मैंने ईमानदारी से इसे खरोंच से लिखा था। हालाँकि मुझे लगता है कि इसमें कुछ एक्स्ट्रा हैं, <completitionlist>हैक की तरह , परिणामस्वरूप वर्ग एनम की तरह दिखता है, पार्स पर प्रतिबिंब का कोई उपयोग नहीं (), नूगेट पैकेज और रेपो जहां मैं उम्मीद करता हूं कि आने वाले मुद्दों और प्रतिक्रिया को संबोधित करेंगे।


3

यहाँ कुछ उत्तरों के आधार पर मैंने एक पुन: प्रयोज्य बेस क्लास को लागू किया है जो एक एनम के व्यवहार की नकल करता है लेकिन stringअंतर्निहित प्रकार के साथ। यह सहित विभिन्न कार्यों का समर्थन करता है:

  1. संभावित मूल्यों की सूची प्राप्त करना
  2. स्ट्रिंग में परिवर्तित करना
  3. अन्य मामलों के साथ तुलना के माध्यम से .Equals, ==और!=
  4. JSON.NET JsonConverter का उपयोग करके JSON से / के लिए रूपांतरण

यह संपूर्णता में आधार वर्ग है:

public abstract class StringEnumBase<T> : IEquatable<T>
    where T : StringEnumBase<T>
{
    public string Value { get; }

    protected StringEnumBase(string value) => this.Value = value;

    public override string ToString() => this.Value;

    public static List<T> AsList()
    {
        return typeof(T)
            .GetProperties(BindingFlags.Public | BindingFlags.Static)
            .Where(p => p.PropertyType == typeof(T))
            .Select(p => (T)p.GetValue(null))
            .ToList();
    }

    public static T Parse(string value)
    {
        List<T> all = AsList();

        if (!all.Any(a => a.Value == value))
            throw new InvalidOperationException($"\"{value}\" is not a valid value for the type {typeof(T).Name}");

        return all.Single(a => a.Value == value);
    }

    public bool Equals(T other)
    {
        if (other == null) return false;
        return this.Value == other?.Value;
    }

    public override bool Equals(object obj)
    {
        if (obj == null) return false;
        if (obj is T other) return this.Equals(other);
        return false;
    }

    public override int GetHashCode() => this.Value.GetHashCode();

    public static bool operator ==(StringEnumBase<T> a, StringEnumBase<T> b) => a?.Equals(b) ?? false;

    public static bool operator !=(StringEnumBase<T> a, StringEnumBase<T> b) => !(a?.Equals(b) ?? false);

    public class JsonConverter<T> : Newtonsoft.Json.JsonConverter
        where T : StringEnumBase<T>
    {
        public override bool CanRead => true;

        public override bool CanWrite => true;

        public override bool CanConvert(Type objectType) => ImplementsGeneric(objectType, typeof(StringEnumBase<>));

        private static bool ImplementsGeneric(Type type, Type generic)
        {
            while (type != null)
            {
                if (type.IsGenericType && type.GetGenericTypeDefinition() == generic)
                    return true;

                type = type.BaseType;
            }

            return false;
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            JToken item = JToken.Load(reader);
            string value = item.Value<string>();
            return StringEnumBase<T>.Parse(value);
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            if (value is StringEnumBase<T> v)
                JToken.FromObject(v.Value).WriteTo(writer);
        }
    }
}

और यह है कि आप अपने "स्ट्रिंग एनम" को कैसे लागू करेंगे:

[JsonConverter(typeof(JsonConverter<Colour>))]
public class Colour : StringEnumBase<Colour>
{
    private Colour(string value) : base(value) { }

    public static Colour Red => new Colour("red");
    public static Colour Green => new Colour("green");
    public static Colour Blue => new Colour("blue");
}

जो इस तरह इस्तेमाल किया जा सकता है:

public class Foo
{
    public Colour colour { get; }

    public Foo(Colour colour) => this.colour = colour;

    public bool Bar()
    {
        if (this.colour == Colour.Red || this.colour == Colour.Blue)
            return true;
        else
            return false;
    }
}

मुझे आशा है कि किसी को यह उपयोगी लगता है!


2

अच्छी तरह से पहले आप तार को असाइन करने की कोशिश करते हैं न कि चार्ट, भले ही वे सिर्फ एक चरित्र हों। "," के बजाय "," का उपयोग करें। अगली बात यह है कि, एनम केवल charयूनिकोड मान का उपयोग कर सकते हैं, लेकिन मैं आपको ऐसा न करने की दृढ़ता से सलाह दूंगा। यदि आप निश्चित हैं कि ये मूल्य अलग-अलग संस्कृतियों और भाषाओं में समान हैं, तो मैं स्थिर तारों के साथ एक स्थिर वर्ग का उपयोग करूंगा।


2

हालांकि यह वास्तव में नहीं एक उपयोग करना संभव है charया एक stringएक enum के लिए आधार के रूप में, मुझे लगता है कि यह क्या तुम सच में की तरह क्या करना है नहीं है।

जैसा आपने उल्लेख किया है कि आप संभावनाओं की एक कल्पना करना चाहते हैं और एक कॉम्बो बॉक्स के भीतर इस का एक स्ट्रिंग प्रतिनिधित्व दिखाते हैं। यदि उपयोगकर्ता इनमें से एक स्ट्रिंग प्रतिनिधित्व का चयन करता है तो आप संबंधित एनम को बाहर निकालना चाहेंगे। और यह संभव है:

पहले हमें कुछ स्ट्रिंग को एनम वैल्यू से जोड़ना होगा। यह यहाँ या यहाँDescriptionAttribute वर्णित की तरह का उपयोग करके किया जा सकता है ।

अब आपको enum मानों और इसी विवरण की एक सूची बनाने की आवश्यकता है। यह निम्नलिखित विधि का उपयोग करके किया जा सकता है:

/// <summary>
/// Creates an List with all keys and values of a given Enum class
/// </summary>
/// <typeparam name="T">Must be derived from class Enum!</typeparam>
/// <returns>A list of KeyValuePair&lt;Enum, string&gt; with all available
/// names and values of the given Enum.</returns>
public static IList<KeyValuePair<T, string>> ToList<T>() where T : struct
{
    var type = typeof(T);

    if (!type.IsEnum)
    {
        throw new ArgumentException("T must be an enum");
    }

    return (IList<KeyValuePair<T, string>>)
            Enum.GetValues(type)
                .OfType<T>()
                .Select(e =>
                {
                    var asEnum = (Enum)Convert.ChangeType(e, typeof(Enum));
                    return new KeyValuePair<T, string>(e, asEnum.Description());
                })
                .ToArray();
}

अब आपके पास सभी एनाम और उनके विवरण के प्रमुख मूल्य जोड़े की एक सूची होगी। तो चलो बस एक कॉम्बो बॉक्स के लिए डेटा स्रोत के रूप में इसे असाइन करें।

var comboBox = new ComboBox();
comboBox.ValueMember = "Key"
comboBox.DisplayMember = "Value";
comboBox.DataSource = EnumUtilities.ToList<Separator>();

comboBox.SelectedIndexChanged += (sender, e) =>
{
    var selectedEnum = (Separator)comboBox.SelectedValue;
    MessageBox.Show(selectedEnum.ToString());
}

उपयोगकर्ता एनम के सभी स्ट्रिंग अभ्यावेदन देखता है और आपके कोड के भीतर आपको वांछित एनम मान मिलेगा।


0

हम एन्यूमरेशन को स्ट्रिंग प्रकार के रूप में परिभाषित नहीं कर सकते हैं। किसी एनम के लिए अनुमोदित प्रकार बाइट, सोबते, शॉर्ट, यूथोर्ट, इंट, यूइंट, लॉन्ग या अलॉन्ग हैं।

यदि आपको गणना पर अधिक जानकारी चाहिए तो कृपया नीचे दिए गए लिंक का अनुसरण करें, यह लिंक आपको गणना को समझने में मदद करेगा। गणना

@ narendras1414


0

इससे मेरा काम बनता है..

   public class ShapeTypes
    {
        private ShapeTypes() { }
        public static string OVAL
        {
            get
            {
                return "ov";
            }
            private set { }
        }

        public static string SQUARE
        {
            get
            {
                return "sq";
            }
            private set { }
        }

        public static string RECTANGLE
        {
            get
            {
                return "rec";
            }
            private set { }
        }
    }

0

मैंने हाल ही में जो करना शुरू किया है वह ट्यूपल्स का उपयोग कर रहा है

public static (string Fox, string Rabbit, string Horse) Animals = ("Fox", "Rabbit", "Horse");
...
public static (string Comma, string Tab, string Space) SeparatorChars = (",", "\t", " ");

-1

एनुमरेशन क्लास

 public sealed class GenericDateTimeFormatType
    {

        public static readonly GenericDateTimeFormatType Format1 = new GenericDateTimeFormatType("dd-MM-YYYY");
        public static readonly GenericDateTimeFormatType Format2 = new GenericDateTimeFormatType("dd-MMM-YYYY");

        private GenericDateTimeFormatType(string Format)
        {
            _Value = Format;
        }

        public string _Value { get; private set; }
    }

कुम्भकरण

public static void Main()
{
       Country A = new Country();

       A.DefaultDateFormat = GenericDateTimeFormatType.Format1;

      Console.ReadLine();
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.