दिलचस्प पोस्ट
एस्प्रेसो में एक रीसायकलदृश्य के अंदर किसी आइटम पर कैसे क्लिक करें पोस्ट-रीडायरेक्ट-एएसपी। नेट से प्राप्त करें xcode 5.1: libCordova.a वास्तुकला समस्याएं कोशिश-छोड़कर ब्लॉक के साथ अजगर "से" कथन का उपयोग करना स्मार्ट पृष्ठांकन एल्गोरिथ्म क्या एक PHP सैंडबॉक्स है, JSFiddle जैसा कुछ जेएस है? एंड्रॉइड एपीआई 10 में ग्रिड लेआउट समर्थन आप asp.net MVC फ्रेमवर्क में एकाधिक सबमिट बटन कैसे संभाल सकते हैं? पायथन में नियमित अभिव्यक्ति के साथ नेस्टेड स्ट्रक्चरस मिलान करना सी # में मुक्केबाजी की घटना HTML5 और जावास्क्रिप्ट के साथ वीडियो से फ्रेम कैप्चर करें मैं .exe के लिए मेरे पायथन 3 ऐप को कैसे संकलित कर सकता हूं? क्या शॉर्ट सर्किटिंग लॉजिकल ऑपरेटर अनिवार्य है? और मूल्यांकन आदेश? डी 3 बल लेआउट – सूचकांक के बजाय नाम से नोड्स को जोड़ने 32 बिट आवेदन से 64 बिट रजिस्ट्री पढ़ना

सी #: गतिशील रनटाइम डाली

मैं निम्न हस्ताक्षर के साथ एक विधि को लागू करना चाहता हूं

dynamic Cast(object obj, Type castTo); 

कोई जानता है कि उसे कैसे करना है? obj निश्चित रूप से कास्ट लागू करता है लेकिन मेरे ऐप के रनटाइम बाइंडिंग सामान के कुछ काम करने के लिए ठीक से डाली जाने की जरूरत है।

संपादित करें: यदि कुछ जवाब नहीं समझते हैं, तो मैं शुरू में गलती से dynamic Cast(dynamic obj, Type castTo); – मेरा मतलब है कि इनपुट object या कुछ अन्य गारंटीकृत बेस क्लास होना चाहिए

Solutions Collecting From Web of "सी #: गतिशील रनटाइम डाली"

मुझे लगता है कि आप कास्टिंग और यहां परिवर्तित करने के मुद्दों को भ्रमित कर रहे हैं।

  • कास्टिंग: एक संदर्भ के प्रकार को बदलने का कार्य जो किसी ऑब्जेक्ट को इंगित करता है। या तो ऑब्जेक्ट पदानुक्रम को ऊपर या नीचे या एक कार्यान्वित इंटरफ़ेस पर ले जाना
  • परिवर्तित करना: एक अलग प्रकार के मूल स्रोत ऑब्जेक्ट से एक नई ऑब्जेक्ट बनाना और उस प्रकार के संदर्भ के माध्यम से इसे एक्सेस करना।

2 में सी # के बीच के अंतर को जानने में अक्सर मुश्किल है क्योंकि उनमें से दोनों एक ही सी # ऑपरेटर का उपयोग करते हैं: कास्ट।

इस स्थिति में आप निश्चित रूप से एक कलाकार अभियान की तलाश नहीं कर रहे हैं। dynamic को एक और dynamic रूप से कास्टिंग अनिवार्य रूप से एक पहचान रूपांतरण है। यह कोई मान प्रदान नहीं करता है क्योंकि आप केवल एक ही अंतर्निहित ऑब्जेक्ट पर वापस एक dynamic संदर्भ प्राप्त कर रहे हैं। परिणामस्वरूप लुकअप अलग नहीं होगा।

इसके बजाय, इस परिदृश्य में आप जो चाहते हैं, वह रूपांतरण है। यह एक अलग प्रकार के अंतर्निहित ऑब्जेक्ट को मोर्फ़िंग कर रहा है और dynamic फैशन में परिणामी वस्तु तक पहुंच रहा है। इस के लिए सबसे अच्छा एपीआई Convert.ChangeTypeConvert.ChangeType

 public static dynamic Convert(dynamic source, Type dest) { return Convert.ChangeType(source, dest); } 

संपादित करें

अद्यतन प्रश्न में निम्न पंक्ति है:

ओज निश्चित रूप से कास्ट को लागू करता है

यदि यह मामला है तो Cast पद्धति की आवश्यकता नहीं है। स्रोत object को केवल एक dynamic संदर्भ को सौंपा जा सकता है।

 dynamic d = source; 

ऐसा लगता है कि आप जो कुछ हासिल करने का प्रयास कर रहे हैं वह एक dynamic संदर्भ के माध्यम से source के पदानुक्रम में एक विशेष इंटरफ़ेस या प्रकार को देखने के लिए है। यह बस संभव नहीं है परिणामस्वरूप dynamic संदर्भ क्रियान्वयन ऑब्जेक्ट को सीधे देखेंगे। यह स्रोत के पदानुक्रम में किसी खास प्रकार से नहीं दिखता है। इसलिए पदानुक्रम में एक अलग प्रकार कास्टिंग करने का विचार और फिर dynamic वापस बस पहली जगह में dynamic को निर्दिष्ट करने के लिए बिल्कुल समान है। यह अभी भी उसी अंतर्निहित ऑब्जेक्ट को इंगित करेगा।

यह काम करना चाहिए:

 public static dynamic Cast(dynamic obj, Type castTo) { return Convert.ChangeType(obj, castTo); } 

संपादित करें

मैंने निम्नलिखित परीक्षण कोड लिखा है:

 var x = "123"; var y = Cast(x, typeof(int)); var z = y + 7; var w = Cast(z, typeof(string)); // w == "130" 

यह "टाइपकास्टिंग" जैसी तरह की तरह है जो एक भाषा में पाई जाती है जैसे पीएचपी, जावास्क्रिप्ट या पायथन (क्योंकि यह वांछित प्रकार के मूल्य को भी परिवर्तित करता है) मुझे नहीं पता कि यह एक अच्छी बात है, लेकिन यह निश्चित रूप से काम करता है … 🙂

सर्वश्रेष्ठ मैं अभी तक मिल गया:

 dynamic DynamicCast(object entity, Type to) { var openCast = this.GetType().GetMethod("Cast", BindingFlags.Static | BindingFlags.NonPublic); var closeCast = openCast.MakeGenericMethod(to); return closeCast.Invoke(entity, new[] { entity }); } static T Cast<T>(object entity) where T : class { return entity as T; } 

ओपनसोर्स फ्रेमवर्क डायनेमेटी में एक स्थिर तरीका है जो दूसरों के बीच कास्ट रूपांतरण सहित डीएलआरआर का इस्तेमाल करते हुए देर से बंधन रखता है ।

 dynamic Cast(object obj, Type castTo){ return Dynamic.InvokeConvert(obj, castTo, explict:true); } 

Cast<T> प्रतिबिंब का उपयोग करते हुए इस का लाभ यह है कि यह किसी भी IDynamicMetaObjectProvider लिए भी काम करेगा जिसमें गतिशील रूपांतरण ऑपरेटर हैं IDynamicMetaObjectProvider DynamicObject पर DynamicObject

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

गतिशीलता के साथ काम करने की समस्या यह है कि आप किसी भी कार्य को गतिशील ऑब्जेक्ट से सीधे नहीं जोड़ सकते। आपको ऐसी कोई ऐसी चीज का उपयोग करना होगा जो हर असाइनमेंट को समझ सकें जो आप हर बार समझाना नहीं चाहते।

इस सरल समाधान की योजना बनाते समय, मैंने देखा कि वैध वस्तुओं का पुन: टाइप करने का प्रयास करते समय वैध मध्यस्थ क्या हैं I मुझे पता चला कि एक द्विआधारी सरणी, स्ट्रिंग (एक्सएमएल, जेएसएन ) या एक रूपांतरण ( आईकोनवॉर्टेबल ) को कड़ी मेहनत करना सामान्य दृष्टिकोण थे मैं कोड बनाए रखने के कारक और आलस्य के कारण द्विआधारी रूपांतरणों में नहीं जाना चाहता।

मेरा सिद्धांत यह था कि न्यूटनसॉफ्ट स्ट्रिंग मध्यस्थ का उपयोग कर ऐसा कर सकता था।

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

सी#:

 //This lives in a helper class public static ConvertDynamic<T>(dynamic data) { return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(Newtonsoft.Json.JsonConvert.SerializeObject(data)); } //Same helper, but in an extension class (public static class), //but could be in a base class also. public static ToModelList<T>(this List<dynamic> list) { List<T> retList = new List<T>(); foreach(dynamic d in list) { retList.Add(ConvertDynamic<T>(d)); } } 

उस ने कहा, यह एक ऐसी उपयोगिता को फिट बैठता है जो मैंने एक साथ रखी है जिससे मुझे किसी भी ऑब्जेक्ट को गतिशील बना सकते हैं। मुझे पता है कि मुझे सही ढंग से करने के लिए प्रतिबिंब का उपयोग करना था:

 public static dynamic ToDynamic(this object value) { IDictionary<string, object> expando = new ExpandoObject(); foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(value.GetType())) expando.Add(property.Name, property.GetValue(value)); return expando as ExpandoObject; } 

मुझे उस समारोह की पेशकश करनी थी। डायनेमिक टाइप वैरिएबल को निर्दिष्ट एक मनमानी ऑब्जेक्ट किसी IDictionary में परिवर्तित नहीं किया जा सकता है, और कन्वर्ट डायनेमिक फ़ंक्शन को तोड़ देगा। इस फ़ंक्शन चेन का उपयोग करने के लिए इसे सिस्टम। डायनेमिक की गतिशील प्रदान करनी होगी। एक्स्पेंडोबाइज, या आईडीशीय <स्ट्रिंग, ऑब्जेक्ट>

एक सामान्य प्रयास करें:

 public static T CastTo<T>(this dynamic obj, bool safeCast) where T:class { try { return (T)obj; } catch { if(safeCast) return null; else throw; } } 

यह एक्सटेंशन विधि प्रारूप में है, इसलिए इसका उपयोग ऐसे होगा जैसे वह गतिशील ऑब्जेक्ट्स का सदस्य था:

 dynamic myDynamic = new Something(); var typedObject = myDynamic.CastTo<Something>(false); 

संपादित करें: Grr, वह नहीं देखा। हां, आप जेनेरिक को प्रतिबिंबित कर सकते हैं, और एक गैर-सामान्य विस्तार विधि में छिपाना मुश्किल नहीं होगा:

 public static dynamic DynamicCastTo(this dynamic obj, Type castTo, bool safeCast) { MethodInfo castMethod = this.GetType().GetMethod("CastTo").MakeGenericMethod(castTo); return castMethod.Invoke(null, new object[] { obj, safeCast }); } 

मुझे अभी यकीन नहीं है कि आप इस से क्या हासिल करेंगे। असल में आप एक गतिशील ले रहे हैं, एक परावर्तित प्रकार के लिए एक कलाकार को मजबूर करते हैं, फिर इसे एक गतिशील में वापस भरना। शायद आप सही कह रहे हैं, मुझे पूछना नहीं चाहिए। लेकिन, यह शायद आप जो करना चाहते हैं वह करेंगे। असल में जब आप गतिशील-भूमि में जाते हैं, तो आप सबसे अधिक कास्टिंग ऑपरेशन करने की आवश्यकता खो देते हैं क्योंकि आप जान सकते हैं कि ऑब्जेक्ट क्या है और चिंतनशील तरीकों या परीक्षण और त्रुटि के माध्यम से है, इसलिए ऐसा करने के लिए कई खूबसूरत तरीके नहीं हैं।

वैकल्पिक रूप से:

 public static T Cast<T>(this dynamic obj) where T:class { return obj as T; }