निम्नलिखित वस्तुओं को देखते हुए:
public class Customer {
public String Name { get; set; }
public String Address { get; set; }
}
public class Invoice {
public String ID { get; set; }
public DateTime Date { get; set; }
public Customer BillTo { get; set; }
}
मैं एक Invoice
की Name
संपत्ति प्राप्त करने के माध्यम से जाने के लिए प्रतिबिंब का उपयोग करना चाहता हूं Customer
। यहाँ मैं इसके बाद क्या कर रहा हूँ, यह मानते हुए कि यह कोड काम करेगा:
Invoice inv = GetDesiredInvoice(); // magic method to get an invoice
PropertyInfo info = inv.GetType().GetProperty("BillTo.Address");
Object val = info.GetValue(inv, null);
बेशक, यह विफल रहता है क्योंकि "बिल्टो.एड्रेस" Invoice
क्लास की वैध संपत्ति नहीं है ।
इसलिए, मैंने इस अवधि में स्ट्रिंग को टुकड़ों में विभाजित करने के लिए एक विधि लिखने की कोशिश की, और उन वस्तुओं को चलाएं जो अंतिम मूल्य की तलाश कर रहे थे जिसमें मैं रुचि रखता था। यह ठीक काम करता है, लेकिन मैं इसके साथ पूरी तरह से सहज नहीं हूं:
public Object GetPropValue(String name, Object obj) {
foreach (String part in name.Split('.')) {
if (obj == null) { return null; }
Type type = obj.GetType();
PropertyInfo info = type.GetProperty(part);
if (info == null) { return null; }
obj = info.GetValue(obj, null);
}
return obj;
}
इस पद्धति को कैसे बेहतर बनाया जाए, या इस समस्या को हल करने का एक बेहतर तरीका?
EDIT पोस्ट करने के बाद, मैंने कुछ संबंधित पोस्ट देखीं ... ऐसा कोई उत्तर प्रतीत नहीं होता है जो विशेष रूप से इस प्रश्न को संबोधित करता है। इसके अलावा, मैं अभी भी अपने कार्यान्वयन पर प्रतिक्रिया चाहूंगा।
GetDesiredInvoice
रिटर्न आपको सीधे वस्तु का प्रकार देता है तो सीधेInvoice
उपयोग क्यों नहींinv.BillTo.Name
?