मैं इस पोस्ट के साथ कुछ चर्चा चाहता हूं।स्थिर वस्तु के लिए ExpandoObject और फिर से वापस। दो डोमेन स्पैनिंग
मैं एक विरासत प्रणाली में सी # 4.0 गतिशील सुविधाओं को शामिल करने के लिए देख रहा हूं। मेरा स्पष्ट उदाहरण डेटा परत में रोब कॉनरी के विशाल का उपयोग कर रहा है। लेकिन मेरे प्रश्न कहीं भी लागू होंगे, एक गतिशील वस्तु को मौजूदा, दृढ़ता से टाइप की गई व्यावसायिक वस्तु के साथ बातचीत करनी चाहिए ताकि गुणों के बीच मैपिंग हो।
मैं करने के लिए और अगले दो (सरलीकृत) तरीकों के साथ स्थिर (ठोस) वस्तुओं और expando वस्तुओं से रूपांतरण को स्वचालित कर सकते हैं:
public static object ToConcrete<T>(System.Dynamic.ExpandoObject dynObject)
{
object instance = Activator.CreateInstance<T>();
var dict = dynObject as IDictionary<string, object>;
PropertyInfo[] targetProperties = instance.GetType().GetProperties();
foreach (PropertyInfo property in targetProperties)
{
object propVal;
if (dict.TryGetValue(property.Name, out propVal))
{
property.SetValue(instance, propVal, null);
}
}
return instance;
}
public static System.Dynamic.ExpandoObject ToExpando(object staticObject)
{
System.Dynamic.ExpandoObject expando = new ExpandoObject();
var dict = expando as IDictionary<string, object>;
PropertyInfo[] properties = staticObject.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
dict[property.Name] = property.GetValue(staticObject, null);
}
return expando;
}
लेकिन अब मैं सवालों की एक संख्या है।
क्या विरासत प्रणाली में गतिशील और गैर-गतिशील होने का मेरा प्रयास मेरे हिस्से पर गलत धारणा का प्रतिनिधित्व करता है? मतलब, क्या मैं गतिशील के इरादे से काम कर रहा हूं? क्या मैं खुद को समस्याओं के लिए स्थापित कर रहा हूं?
क्या मुझे गतिशीलता का उपयोग उन घटकों तक सीमित होना चाहिए जो गतिशील वस्तुओं और स्थैतिक वस्तुओं के बीच कोई मैपिंग न हो? मतलब, क्या दो भाषा डोमेन मिश्रण करने का प्रयास करना बुरा व्यवहार है? क्या मैं खराब वास्तुकला बना रहा हूं? एक विरोधी पैटर्न?
भारी जैसे घटक के मामले में, अगर हम कहते हैं कि एक्सपोन्डोब्जेक्ट और दृढ़ता से टाइप की गई वस्तुओं के बीच मैप करना गलत अभ्यास है, तो मुझे अपनी विरासत प्रणाली में प्लग करने का कोई तरीका नहीं है क्योंकि यह व्यापार वस्तुओं को सतह में रखना चाहिए विरासत कोड और गतिशील वस्तुओं में एक बड़े, विरासत कोड बेस की वस्तुओं को दोबारा करने, या करना चाहिए, कोई व्यावहारिक तरीका नहीं है। शायद गतिशीलता को विरासत में वास्तविक रूप से जोड़ा नहीं जा सकता है। नेट कोड बेस। शायद इसे शुरुआत से ही शामिल किया जाना चाहिए, या बिल्कुल नहीं।
आपको 'ExpandoObject' का उपयोग करने के लिए क्या प्रेरणा है? – svick