2009-02-03 19 views
52

मुझे डेटाबेस से Int16 मान मिला है, और इसे एक enum प्रकार में बदलने की आवश्यकता है। यह दुर्भाग्यवश कोड की एक परत में किया जाता है जो वस्तुओं के बारे में बहुत कम जानता है, इसके अलावा इसे प्रतिबिंब के माध्यम से एकत्रित किया जा सकता है।कनवर्ट करें। चेंज टाइप और enums में कनवर्ट करना?

इस प्रकार, यह Convert.ChangeType पर कॉल करना समाप्त होता है जो अमान्य कास्ट अपवाद के साथ विफल रहता है।

मैंने पाया कि मैं क्या एक बदबूदार वैकल्पिक हल पर विचार, इस तरह:

String name = Enum.GetName(destinationType, value); 
Object enumValue = Enum.Parse(destinationType, name, false); 

वहाँ एक बेहतर तरीका है, इसलिए है कि मैं इस स्ट्रिंग ऑपरेशन के माध्यम से स्थानांतरित करने के लिए नहीं है?

using System; 

public class MyClass 
{ 
    public enum DummyEnum 
    { 
     Value0, 
     Value1 
    } 

    public static void Main() 
    { 
     Int16 value = 1; 
     Type destinationType = typeof(DummyEnum); 

     String name = Enum.GetName(destinationType, value); 
     Object enumValue = Enum.Parse(destinationType, name, false); 

     Console.WriteLine("" + value + " = " + enumValue); 
    } 
} 
+0

आउच ... मैं इस तरह सवालों के जवाब देने की कोशिश कर रहा रोकने की आवश्यकता से पहले मैं अपने कॉफी लिया है ... –

+0

मैं अब देखते हैं , Console.WriteLine एक परत में भी है जिसमें enum प्रकार तक पहुंच नहीं है। मैं पूरी तरह से गलत समझा। मेरा (बेवकूफ) जवाब हटा दिया गया। – GvS

उत्तर

74

Enum.ToObject(.... आप जो खोज रहे हैं:

यहाँ एक छोटी है, लेकिन पूरा, कार्यक्रम है कि अगर कोई प्रयोग करने के लिए की जरूरत है इस्तेमाल किया जा सकता है!

सी #

StringComparison enumValue = (StringComparison)Enum.ToObject(typeof(StringComparison), 5); 

VB.NET

Dim enumValue As StringComparison = CType([Enum].ToObject(GetType(StringComparison), 5), StringComparison) 

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

public class Enum<EnumType> where EnumType : struct, IConvertible 
{ 

    /// <summary> 
    /// Retrieves an array of the values of the constants in a specified enumeration. 
    /// </summary> 
    /// <returns></returns> 
    /// <remarks></remarks> 
    public static EnumType[] GetValues() 
    { 
     return (EnumType[])Enum.GetValues(typeof(EnumType)); 
    } 

    /// <summary> 
    /// Converts the string representation of the name or numeric value of one or more enumerated constants to an equivalent enumerated object. 
    /// </summary> 
    /// <param name="name"></param> 
    /// <returns></returns> 
    /// <remarks></remarks> 
    public static EnumType Parse(string name) 
    { 
     return (EnumType)Enum.Parse(typeof(EnumType), name); 
    } 

    /// <summary> 
    /// Converts the string representation of the name or numeric value of one or more enumerated constants to an equivalent enumerated object. 
    /// </summary> 
    /// <param name="name"></param> 
    /// <param name="ignoreCase"></param> 
    /// <returns></returns> 
    /// <remarks></remarks> 
    public static EnumType Parse(string name, bool ignoreCase) 
    { 
     return (EnumType)Enum.Parse(typeof(EnumType), name, ignoreCase); 
    } 

    /// <summary> 
    /// Converts the specified object with an integer value to an enumeration member. 
    /// </summary> 
    /// <param name="value"></param> 
    /// <returns></returns> 
    /// <remarks></remarks> 
    public static EnumType ToObject(object value) 
    { 
     return (EnumType)Enum.ToObject(typeof(EnumType), value); 
    } 
} 

अब बजाय (StringComparison)Enum.ToObject(typeof(StringComparison), 5); लिखने की आप बस Enum<StringComparison>.ToObject(5); लिख सकते हैं।

public static class EnumUtils 
{ 
     public static bool TryParse<TEnum>(int? value, out TEnum result) 
      where TEnum: struct, IConvertible 
     { 
      if(!value.HasValue || !Enum.IsDefined(typeof(TEnum), value)){ 
       result = default(TEnum); 
       return false; 
      } 
      result = (TEnum)Enum.ToObject(typeof(TEnum), value); 
      return true; 
     } 
} 

का उपयोग EnumUtils.TryParse<YourEnumType>(someNumber, out result) कई परिदृश्यों के लिए उपयोगी हो जाता है:

+1

वही है जो मैं खोज रहा था, धन्यवाद! –

+3

किंवदंती! इसके बारे में नहीं पता था। Stackoverflow ब्रिल नहीं है ?! :-) –

+1

अच्छी तरह से मैं किंवदंती के बारे में नहीं जानता लेकिन धन्यवाद: पी – Peter

0

@ पीटर उत्तर यहाँ के आधार पर के लिए Nullable<int> को Enum रूपांतरण विधि है। उदाहरण के लिए, Asp.NET में WebApi नियंत्रक में अमान्य एनम पैरा के खिलाफ डिफ़ॉल्ट सुरक्षा नहीं है। Asp.NET केवल default(YourEnumType) मान का उपयोग करेगा, भले ही कुछ null, -1000, 500000, "garbage string" या पूरी तरह पैरामीटर को अनदेखा कर दें। इसके अलावा, ModelState इन सभी मामलों में मान्य होगा, तो समाधान में से एक कस्टम चेक के साथ int? प्रकार का उपयोग करने

public class MyApiController: Controller 
{ 
    [HttpGet] 
    public IActionResult Get(int? myEnumParam){  
     MyEnumType myEnumParamParsed; 
     if(!EnumUtils.TryParse<MyEnumType>(myEnumParam, out myEnumParamParsed)){ 
      return BadRequest($"Error: parameter '{nameof(myEnumParam)}' is not specified or incorrect"); 
     }  

     return this.Get(washingServiceTypeParsed);    
    } 
    private IActionResult Get(MyEnumType myEnumParam){ 
     // here we can guarantee that myEnumParam is valid 
    } 
0

आप एक DataTable में एक Enum भंडारण कर रहे हैं, लेकिन पता नहीं है जो स्तंभ हैं एक enum है और जो एक स्ट्रिंग/पूर्णांक है, तो आप मूल्य इस तरह से उपयोग कर सकते हैं:

foreach (DataRow dataRow in myDataTable.Rows) 
{ 
    Trace.WriteLine("=-=-=-=-=-=-=-=-=-=-=-=-=-=-="); 
    foreach (DataColumn dataCol in myDataTable.Columns) 
    { 
     object v = dataRow[dataCol]; 
     Type t = dataCol.DataType; 
     bool e = false; 
     if (t.IsEnum) e = true; 

     Trace.WriteLine((dataCol.ColumnName + ":").PadRight(30) + 
      (e ? Enum.ToObject(t, v) : v)); 
    } 
} 
संबंधित मुद्दे