दिलचस्प पोस्ट
सी ++ मानक: संदर्भ प्राप्त करने के लिए शून्य सूचक को हटाया जा रहा है? पायथन: जांचें कि क्या स्ट्रिंग एक इंट का प्रतिनिधित्व करती है, बिना कोशिश / सिवाय इस्तेमाल किए? MVVM लाइट: ब्लेंड, आसान तरीका या स्निपेट के बिना XAML में इवेंटटोकमांड को जोड़ना? मैं किस प्रकार बता सकता हूं कि PHP फार्म में सबमिट किए जाने वाले बटन को कैसे सबमिट किया गया था? यूआईएलबीएल आकार टोटफिट आटोलेआऊट आईओएस 6 के साथ काम नहीं करता है सेकेंड में अधिक मानव पठनीय रूप में दिए गए समय अंतराल कन्वर्ट करें एक UIPickerView की चयन पट्टी में निश्चित लेबल C / Objective-C में कई पंक्तियों में एक स्ट्रिंग को अक्षरशः विभाजित कैसे करें? Javafx टेबलव्यूले सभी कॉलम में डेटा नहीं दिखा रहा है मैं Visual Studio (और / या ReSharper) का उपयोग कर कक्षा क्षेत्रों से एक कंसट्रक्टर कैसे बना सकता हूं? छवि तुलना एल्गोरिथम मैं jQuery का उपयोग कर एक तत्व की पूर्ण स्थिति कैसे प्राप्त करूं? शून्य में शून्य सूचक के लिए पॉइंटर अंकगणित मैं 'शुद्ध' स्विफ्ट (w / o @objc) में एक कमजोर प्रोटोकॉल संदर्भ कैसे बना सकता हूं Mysql :: त्रुटि: निर्दिष्ट कुंजी बहुत लंबी थी; अधिकतम कुंजी लंबाई 1000 बाइट्स है

सी # में डायनामिक एन्यूम

मैं डेटाबेस खोज तालिका में मानों (एंटरप्राइज़ लाइब्रेरी डेटा परत का उपयोग करके) के आधार पर सी # में डायनामिक एन्यूम (और बाद में एन्यूम विकल्पों का उपयोग कैसे कर सकता हूं)?

उदाहरण के लिए, यदि मैं डेटाबेस में एक नया लुकअप वैल्यू जोड़ता हूं, तो मैं कोड में अतिरिक्त स्थिर enum मान घोषणा को जोड़ना नहीं चाहता।

क्या ऐसा कोई चीज है? मैं एक कोड तैयार नहीं करना चाहता हूं जो स्थिर इंम्यूम ( कोड प्रोजेक्ट आलेख ऐन कोड जेनरेटर के अनुसार – डाटाबेस को स्वचालित रूप से तालिकाओं को देखने के लिए जनरेटिंग एंगम कोड ) तैयार करता है और इसे पूरी तरह गतिशील होना पसंद करता है

वेब के समाधान से एकत्रित समाधान "सी # में डायनामिक एन्यूम"

मैं यह सही काम कर रहा हूं, लेकिन इसके लिए आपको कुछ प्रकार की कोड पीढ़ी करने की ज़रूरत है

मेरे समाधान में, मैंने एक परियोजना "एनुमेरेटेड टाइप" जोड़ दिया यह एक कंसोल एप्लिकेशन है जो डेटाबेस से सभी मूल्यों को प्राप्त करता है और उनसे enums का निर्माण करता है। फिर यह सभी विधानसभाओं के लिए सभी enums बचाता है

Enum पीढ़ी कोड इस तरह है:

// Get the current application domain for the current thread AppDomain currentDomain = AppDomain.CurrentDomain; // Create a dynamic assembly in the current application domain, // and allow it to be executed and saved to disk. AssemblyName name = new AssemblyName("MyEnums"); AssemblyBuilder assemblyBuilder = currentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.RunAndSave); // Define a dynamic module in "MyEnums" assembly. // For a single-module assembly, the module has the same name as the assembly. ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(name.Name, name.Name + ".dll"); // Define a public enumeration with the name "MyEnum" and an underlying type of Integer. EnumBuilder myEnum = moduleBuilder.DefineEnum("EnumeratedTypes.MyEnum", TypeAttributes.Public, typeof(int)); // Get data from database MyDataAdapter someAdapter = new MyDataAdapter(); MyDataSet.MyDataTable myData = myDataAdapter.GetMyData(); foreach (MyDataSet.MyDataRow row in myData.Rows) { myEnum.DefineLiteral(row.Name, row.Key); } // Create the enum myEnum.CreateType(); // Finally, save the assembly assemblyBuilder.Save(name.Name + ".dll"); 

समाधान संदर्भ में मेरी अन्य परियोजनाएं इस जनसभा को तैयार करती हैं नतीजतन, मैं तब गतिशील ऊर्जा का उपयोग कर सकते हैं कोड, intellisense के साथ पूरा।

उसके बाद, मैंने एक पोस्ट-बिल्ड इवेंट जोड़ा है, जिससे कि "एन्युमरेट कीट्स" प्रोजेक्ट के निर्माण के बाद, यह स्वयं चलाता है और "MyEnums.dll" फ़ाइल को उत्पन्न करता है।

वैसे, यह आपके प्रोजेक्ट के बिल्ड ऑर्डर को बदलने में मदद करता है ताकि "एनिमेटेडटैप्स" पहले बनाया गया हो। अन्यथा, एक बार जब आप अपने गतिशील रूप से उत्पन्न। Dll का प्रयोग शुरू करते हैं, तो आप एक बिल्ड नहीं कर पाएंगे यदि .dll को कभी भी हटाया जाता है (चिकन और अंडे की समस्या – समाधान में आपकी अन्य परियोजनाओं को यह ठीक से बनाने के लिए। Dll की आवश्यकता होती है, और जब तक आप अपने समाधान का निर्माण नहीं करते तब तक आप। Dll नहीं बना सकते हैं …)

मुझे इस एमएसडीएन लेख से ऊपर दिए गए अधिकांश कोड मिले हैं

उम्मीद है की यह मदद करेगा!

आपको एहसास है कि समय के संकलन पर एनोम को निर्दिष्ट करना चाहिए? आप रन-टाइम के दौरान गतिशील रूप से जोड़ नहीं सकते हैं – और आप ऐसा क्यों करेंगे, कोड में उनका उपयोग / संदर्भ नहीं होगा?

व्यावसायिक सी # 2008 से:

सी # में enums की वास्तविक शक्ति यह है कि वे दृश्यों के पीछे बेस क्लास, सिस्टम.एन्नम से प्राप्त स्ट्रैक्ट्स के रूप में इन्स्टिट्यूएटेड हैं। इसका मतलब यह है कि कुछ उपयोगी कार्य करने के लिए उनके खिलाफ तरीके कॉल करना संभव है। नोट करें कि जिस तरह से। NET फ्रेमवर्क कार्यान्वित किया जाता है, वहीं स्ट्रेट्स के रूप में वाक्य-क्रिया के रूप में ईमान के इलाज के साथ कोई प्रदर्शन हानि नहीं हुई है। प्रथा में, एक बार आपका कोड संकलित हो जाता है, तो एनम आदिम प्रकार के रूप में मौजूद होंगे, जैसे कि इंट और फ्लोट।

तो, मुझे यकीन नहीं है कि आप जिस तरह से आप चाहते हैं, Enums का उपयोग कर सकते हैं

क्या यह वास्तविक गन होना चाहिए? इसके बजाय एक Dictionary<string,int> का उपयोग करने के बारे में कैसे?

उदाहरण के लिए

 Dictionary<string, int> MyEnum = new Dictionary(){{"One", 1}, {"Two", 2}}; Console.WriteLine(MyEnum["One"]); 

सिर्फ "शेल्फ" कोड और कुछ स्पष्टीकरण के साथ पांडिनुस के उत्तर को दिखाया जा रहा है: इस उदाहरण के लिए आपको दो समाधान चाहिए (मुझे पता है कि यह एक के द्वारा भी किया जा सकता है;), उन्नत छात्रों को इसे पेश करने दें …

तो यहां तालिका के लिए डीडीएल एसक्यूएल है:

 USE [ocms_dev] GO CREATE TABLE [dbo].[Role]( [RoleId] [int] IDENTITY(1,1) NOT NULL, [RoleName] [varchar](50) NULL ) ON [PRIMARY] 

तो यहां कंसोल प्रोग्राम है जो डीएलएल का उत्पादन करता है:

 using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Reflection.Emit; using System.Data.Common; using System.Data; using System.Data.SqlClient; namespace DynamicEnums { class EnumCreator { // after running for first time rename this method to Main1 static void Main () { string strAssemblyName = "MyEnums"; bool flagFileExists = System.IO.File.Exists ( AppDomain.CurrentDomain.SetupInformation.ApplicationBase + strAssemblyName + ".dll" ); // Get the current application domain for the current thread AppDomain currentDomain = AppDomain.CurrentDomain; // Create a dynamic assembly in the current application domain, // and allow it to be executed and saved to disk. AssemblyName name = new AssemblyName ( strAssemblyName ); AssemblyBuilder assemblyBuilder = currentDomain.DefineDynamicAssembly ( name, AssemblyBuilderAccess.RunAndSave ); // Define a dynamic module in "MyEnums" assembly. // For a single-module assembly, the module has the same name as // the assembly. ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule ( name.Name, name.Name + ".dll" ); // Define a public enumeration with the name "MyEnum" and // an underlying type of Integer. EnumBuilder myEnum = moduleBuilder.DefineEnum ( "EnumeratedTypes.MyEnum", TypeAttributes.Public, typeof ( int ) ); #region GetTheDataFromTheDatabase DataTable tableData = new DataTable ( "enumSourceDataTable" ); string connectionString = "Integrated Security=SSPI;Persist " + "Security Info=False;Initial Catalog=ocms_dev;Data " + "Source=ysg"; using (SqlConnection connection = new SqlConnection ( connectionString )) { SqlCommand command = connection.CreateCommand (); command.CommandText = string.Format ( "SELECT [RoleId], " + "[RoleName] FROM [ocms_dev].[dbo].[Role]" ); Console.WriteLine ( "command.CommandText is " + command.CommandText ); connection.Open (); tableData.Load ( command.ExecuteReader ( CommandBehavior.CloseConnection ) ); } //eof using foreach (DataRow dr in tableData.Rows) { myEnum.DefineLiteral ( dr[1].ToString (), Convert.ToInt32 ( dr[0].ToString () ) ); } #endregion GetTheDataFromTheDatabase // Create the enum myEnum.CreateType (); // Finally, save the assembly assemblyBuilder.Save ( name.Name + ".dll" ); } //eof Main } //eof Program } //eof namespace 

यहाँ कंसोल प्रोग्रामिंग आउटपुट प्रिंटिंग है (याद रखें कि उसे डीएलएल संदर्भित करना है)। अग्रिम छात्रों को एक ही समाधान में गतिशील लोड हो रहा है और यह जांचने के लिए समाधान प्रदान करते हैं कि क्या पहले से ही डीएलएल का निर्माण किया गया है।

 // add the reference to the newly generated dll use MyEnums ; class Program { static void Main () { Array values = Enum.GetValues ( typeof ( EnumeratedTypes.MyEnum ) ); foreach (EnumeratedTypes.MyEnum val in values) { Console.WriteLine ( String.Format ( "{0}: {1}", Enum.GetName ( typeof ( EnumeratedTypes.MyEnum ), val ), val ) ); } Console.WriteLine ( "Hit enter to exit " ); Console.ReadLine (); } //eof Main } //eof Program 

मान लें कि आपके पास अपने डीबी में निम्नलिखित हैं:

 table enums ----------------- | id | name | ----------------- | 0 | MyEnum | | 1 | YourEnum | ----------------- table enum_values ---------------------------------- | id | enums_id | value | key | ---------------------------------- | 0 | 0 | 0 | Apple | | 1 | 0 | 1 | Banana | | 2 | 0 | 2 | Pear | | 3 | 0 | 3 | Cherry | | 4 | 1 | 0 | Red | | 5 | 1 | 1 | Green | | 6 | 1 | 2 | Yellow | ---------------------------------- 

आपको आवश्यक मान प्राप्त करने के लिए एक का चयन करें:

 select * from enums e inner join enum_values ev on ev.enums_id=e.id where e.id=0 

Enum के लिए स्रोत कोड का निर्माण और आप कुछ मिलेंगे:

 String enumSourceCode = "enum " + enumName + "{" + enumKey1 + "=" enumValue1 + "," + enumKey2 + ... + "}"; 

(जाहिर है यह किसी प्रकार के लूप में बनाया गया है।)

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

 CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); CompilerParameters cs = new CompilerParameters(); cp.GenerateInMemory = True; CompilerResult result = provider.CompileAssemblyFromSource(cp, enumSourceCode); Type enumType = result.CompiledAssembly.GetType(enumName); 

अब आपके पास संकलित और उपयोग के लिए तैयार प्रकार है।
डीबी में संग्रहीत एएनआईम मान प्राप्त करने के लिए आप इसका उपयोग कर सकते हैं:

 [Enum].Parse(enumType, value); 

जहां मान या तो पूर्णांक मान (0, 1, आदि) या एएनआईएम पाठ / कुंजी (ऐप्पल, केला, आदि) हो सकता है

मैंने इसे T4 टेम्पलेट के साथ किया है आपके प्रोजेक्ट में एक .tt फ़ाइल को छोड़ने के लिए काफी तुच्छ है, और पूर्व-बिल्ड चरण के रूप में T4 टेम्पलेट को चलाने के लिए विजुअल स्टूडियो की स्थापना करें।

टी 4 एक। सीसी फ़ाइल उत्पन्न करता है, जिसका मतलब है कि आप इसे डेटाबेस से क्वेरी कर सकते हैं और परिणामी से एक .cs फ़ाइल में एक एएनएम का निर्माण कर सकते हैं। पूर्व बिल्ड कार्य के रूप में वायर्ड, यह हर बिल्ड पर आपकी एन्यूम को फिर से बना देगा या आप इसके बजाय आवश्यक T4 को मैन्युअल रूप से चला सकते हैं।

आप चाहते हैं System.Web.Compilation.BuildProvider

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

आप क्या ढूंढ रहे हैं, प्रदाता हैं यानी System.Web.Compilation.BuildProvider

वे सबसोनिक द्वारा बहुत प्रभावी ढंग से उपयोग किए गए हैं, आप स्रोत को डाउनलोड कर सकते हैं और देख सकते हैं कि उनका उपयोग कैसे किया जा सकता है, आपको आधी हिस्से के रूप में जटिल की आवश्यकता नहीं होगी क्योंकि वे क्या कर रहे हैं।

उम्मीद है की यह मदद करेगा।

मैं हमेशा अपना खुद का "कस्टम एन्यूम" लिखना चाहता हूं मेरे पास एक कक्षा है जो थोड़ा अधिक जटिल है, लेकिन मैं इसे पुन: उपयोग कर सकता हूं:

 public abstract class CustomEnum { private readonly string _name; private readonly object _id; protected CustomEnum( string name, object id ) { _name = name; _id = id; } public string Name { get { return _name; } } public object Id { get { return _id; } } public override string ToString() { return _name; } } public abstract class CustomEnum<TEnumType, TIdType> : CustomEnum where TEnumType : CustomEnum<TEnumType, TIdType> { protected CustomEnum( string name, TIdType id ) : base( name, id ) { } public new TIdType Id { get { return (TIdType)base.Id; } } public static TEnumType FromName( string name ) { try { return FromDelegate( entry => entry.Name.Equals( name ) ); } catch (ArgumentException ae) { throw new ArgumentException( "Illegal name for custom enum '" + typeof( TEnumType ).Name + "'", ae ); } } public static TEnumType FromId( TIdType id ) { try { return FromDelegate( entry => entry.Id.Equals( id ) ); } catch (ArgumentException ae) { throw new ArgumentException( "Illegal id for custom enum '" + typeof( TEnumType ).Name + "'", ae ); } } public static IEnumerable<TEnumType> GetAll() { var elements = new Collection<TEnumType>(); var infoArray = typeof( TEnumType ).GetFields( BindingFlags.Public | BindingFlags.Static ); foreach (var info in infoArray) { var type = info.GetValue( null ) as TEnumType; elements.Add( type ); } return elements; } protected static TEnumType FromDelegate( Predicate<TEnumType> predicate ) { if(predicate == null) throw new ArgumentNullException( "predicate" ); foreach (var entry in GetAll()) { if (predicate( entry )) return entry; } throw new ArgumentException( "Element not found while using predicate" ); } } 

अब मुझे सिर्फ अपनी एन्यूम बनाने की आवश्यकता है जो मैं उपयोग करना चाहता हूं:

  public sealed class SampleEnum : CustomEnum<SampleEnum, int> { public static readonly SampleEnum Element1 = new SampleEnum( "Element1", 1, "foo" ); public static readonly SampleEnum Element2 = new SampleEnum( "Element2", 2, "bar" ); private SampleEnum( string name, int id, string additionalText ) : base( name, id ) { AdditionalText = additionalText; } public string AdditionalText { get; private set; } } 

आखिरकार मैं इसे इस्तेमाल कर सकता हूं जैसे कि मैं चाहता हूं:

  static void Main( string[] args ) { foreach (var element in SampleEnum.GetAll()) { Console.WriteLine( "{0}: {1}", element, element.AdditionalText ); Console.WriteLine( "Is 'Element2': {0}", element == SampleEnum.Element2 ); Console.WriteLine(); } Console.ReadKey(); } 

और मेरा उत्पादन होगा:

 Element1: foo Is 'Element2': False Element2: bar Is 'Element2': True 

आप CodeSmith का उपयोग इस तरह से कुछ उत्पन्न करने के लिए कर सकते हैं:

http://www.csharping.com/PermaLink,guid,cef1b637-7d37-4691-8e49-138cbf1d51e9.aspx

मुझे नहीं लगता कि आप क्या कर रहे हैं यह करने का एक अच्छा तरीका है। और अगर आप इसके बारे में सोचते हैं मुझे नहीं लगता कि यह वही है जो आप वास्तव में चाहते हैं।

यदि आपके पास एक डायनामिक एन्यूम होगा, तो इसका मतलब यह है कि आपको इसे डायनामिक मान के साथ खिलाना होगा जब आप इसका संदर्भ देते हैं हो सकता है कि बहुत सारे जादू के साथ आप कुछ प्रकार की IntelliSense हासिल कर सकें जो कि इस का ख्याल रखेगा और एक DLL फ़ाइल में आपके लिए एक एन्यूम उत्पन्न करेगा। लेकिन उस काम की मात्रा पर विचार करें, जो इंटेलियसेंस जानकारी प्राप्त करने के लिए डाटाबेस तक पहुंचने के साथ-साथ जनरेटेड DLL फ़ाइल को नियंत्रित करने वाले संस्करण के दुःस्वप्न को अपरिभाषित कैसे करेगा।

यदि आप वास्तव में एन्म मूल्यों को मैन्युअल रूप से जोड़ना नहीं चाहते हैं (आपको उन्हें डेटाबेस में जोड़ना होगा) इसके बजाय कोड पीढ़ी उपकरण का उपयोग करें, उदाहरण के लिए T4 टेम्पलेट राइट क्लिक + रन करें और आपको कोड में अपने एंटीम को स्थिर रूप से परिभाषित किया गया है और आपको एनोम का उपयोग करने के सभी लाभ मिलेंगे।

डायनामिक एनमोज़ का इस्तेमाल करना किसी भी तरह से बुरा नहीं है। भविष्य में बनाए रखने के लिए आपको स्पष्ट और आसान कोड आसानी से सुनिश्चित करने के लिए आपको डेटा को "डुप्लिकेट करने" की परेशानी से गुज़रना होगा।

यदि आप स्वचालित जनरेटेड लाइब्रेरी शुरू करना शुरू करते हैं, तो आप निश्चित रूप से भविष्य में डेवलपर्स के लिए अधिक भ्रम पैदा कर रहे हैं, ताकि आपके कोड को उन्नत वर्ग ऑब्जेक्ट के भीतर कोडित करने से आपके कोड को अपग्रेड करना हो।

अन्य उदाहरणों में अच्छा और रोमांचक ध्वनि दी गई है, लेकिन कोड रखरखाव पर ओवरहेड के बारे में सोचो जो आप इसे से प्राप्त करते हैं। इसके अलावा, क्या उन मूल्यों को अक्सर बदलने जा रहे हैं?

Enums रखने और एक ही समय में मूल्यों की डायनेमिक सूची बनाने का एक तरीका यह है कि आपके पास वर्तमान में गतिशील रूप से बनाए गए शब्दकोश के साथ Enums का उपयोग करना है

चूंकि अधिकांश इनमों का इस्तेमाल उस संदर्भ में किया जाता है, जिसका उपयोग वे परिभाषित किया जाता है, और "गतिशील ऊर्जा" को गतिशील प्रक्रियाओं द्वारा समर्थित किया जाएगा, आप 2 को भेद कर सकते हैं।

पहला कदम एक टेबल / संग्रह बनाने के लिए है जो डायनामिक प्रविष्टियों के लिए आईडी और संदर्भ रखता है। तालिका में आप अपने सबसे बड़े एनयूएम मूल्य से अधिक बड़े आकार का ऑटोइन कर सकते हैं।

अब आपके गतिशील एनरम्स का हिस्सा आता है, मैं मान रहा हूं कि आप नियमों का एक सेट बनाने के लिए एनोम्स का प्रयोग करेंगे, जो कुछ गतिशील रूप से उत्पन्न होते हैं।

 Get integer from database If Integer is in Enum -> create Enum -> then run Enum parts If Integer is not a Enum -> create Dictionary from Table -> then run Dictionary parts.