2011-10-04 15 views
5

संभव डुप्लिकेट:
Is it possible to declare an anonymous type in C# with a variable/dynamic set of fields?गतिशील रूप से अज्ञात ऑब्जेक्ट में गुण कैसे जोड़ें?

मैं एक प्रश्न बिल्डर है कि कुछ प्राप्त मूल्यों है कि उपयोगकर्ता मेरी ASP.NET MVC3 आवेदन में स्थापित किया है का परीक्षण करके एक प्रश्न का निर्माण का निर्माण किया है। यह क्वेरी बिल्डर सॉर्टिंग, सीमित और फ़िल्टरिंग (WHERE क्लॉज) जोड़ सकता है और फिर निर्मित क्वेरी लौटा सकता है।

using (IDbConnection connection = new MySqlConnection(ConnectionStringFactory.GetConnectionString(Database.Push))) 
{ 
    connection.Open(); 

    return connection.Query<Notification>(query.QueryString, 
              new 
              { 
               someAnonymousStuffHere = SomeValue 
              }); 
} 

हालांकि, क्वेरी के लिए मानकों (यह एक तैयार बयान है) एक गुमनाम प्रकार में डाल करने की आवश्यकता है:

इस क्वेरी फिर मेरे डैप्पर भंडार के साथ क्वेरी को निष्पादित करने की कोशिश करता है को जाता है। समस्या यह है: मुझे नहीं पता कि इस अज्ञात प्रकार को गतिशील रूप से कैसे बनाया जाए। अब मैं क्वेरी पैरामीटर में सभी पैरामीटर को एक शब्दकोश में दबा रहा हूं, जहां कुंजी संपत्ति का नाम है और मान, ठीक है, मान है।

मैं अपने क्वेरी बिल्डर में एक अनाम प्रकार को परिभाषित नहीं कर सकता क्योंकि निर्माता में कई कदम होते हैं, जिनमें से कुछ निष्पादित नहीं होते हैं। तो कभी-कभी हमारे पास 5 पैरामीटर होते हैं, कभी-कभी हमारे पास 3 पैरामीटर होते हैं, आदि

मुझे उम्मीद है कि मैंने अपनी समस्या को स्पष्ट रूप से स्पष्ट किया है। अधिक जानकारी के लिए पूछने के लिए स्वतंत्र महसूस करें :) अग्रिम धन्यवाद!

+0

आप इस अज्ञात प्रकार के साथ क्या करने की योजना बना रहे हैं जिसका सदस्य आप संकलन समय पर नहीं जानते? – Gabe

+0

अज्ञात प्रकार क्वेरी विधि में जाता है, जो शायद क्वेरी में सही प्लेसहोल्डर को पैरामीटर मैप करेगा। –

+0

http://stackoverflow.com/questions/7437043/is-it-possible-to-declare-an-anonymous-type-in-c-with-a-variable- गतिशील-set-of आपका उत्तर होना चाहिए –

उत्तर

2

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

कुंजी/मानों के शब्दकोश से गतिशील वस्तु को लोड करने का एक उदाहरण यहां दिया गया है, फिर इसे एक्सेस करना जैसे कि यह एक स्थिर टाइप किया गया ऑब्जेक्ट था।

//linqpad 
void Main() 
{ 
    IDictionary<string,object> items = new Dictionary<string,object>(); 
    items.Add("test","123"); 

    dynamic props = DynamicProperties.LoadFromDictionary(items); 

    string item = props.test; 

    item.Dump(); 
} 


public class DynamicProperties : DynamicObject 
{ 
    private DynamicProperties(){} 

    private Dictionary<string, object> dictionary = new Dictionary<string, object>(); 

    public static DynamicProperties LoadFromDictionary(IDictionary<string,object> Dictionary) 
    { 
     dynamic dprop = new DynamicProperties(); 
     foreach(var item in Dictionary) 
     { 
      dprop.dictionary.Add(item.Key.ToLower(),item.Value); 
     } 
     return dprop; 
    } 
    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     string name = binder.Name.ToLower(); 
     Console.WriteLine("Trying to get " + name); 
     return this.dictionary.TryGetValue(name,out result); 
    } 
    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     Console.WriteLine("TrySetMember: " + value.ToString()); 
     this.dictionary[binder.Name.ToLower()] = value; 
     return true; 
    } 
} 
10

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

एक और विकल्प dynamic सुविधा का उपयोग करना है। उदाहरण ExpandoObject के लिए आप एक गतिशील प्रकार बना सकते हैं।

dynamic expando = new ExpandoObject(); 
expando.Name = "Martin"; 
if (((IDictionary<String, Object>) expando).ContainsKey("Name")) 
    Console.WriteLine(expando.Name); 

expando वास्तव में एक महिमा शब्दकोश है और इसके बजाय एक शब्दकोश का उपयोग कर (जैसे आप करते हैं) बाहर बारी एक बेहतर विकल्प हो सकता है: यहाँ आप इसे कैसे उपयोग कर सकते हैं पर एक छोटा सा उदाहरण है।

संबंधित मुद्दे