मैं कुछ कोड है कि एक गुण सेट करने की कोशिश करता विरासत में मिली फेंक देगा:चेक कि क्या PropertyInfo.SetValue एक ArgumentException
object target = ... // some instance on which we want to set a property
object value = ... // some value - in this case, a string
var propertyInfo = ... // some property of target - in this case, not a string
try
{
propertyInfo.SetValue(obj, value, null);
}
catch (ArgumentException)
{
// We go off and look for our own way of converting between
// the type of value and the type of the property.
}
वर्तमान उपयोग अपवाद पकड़ लिया और एक बहुत फेंक दिया जाता है में, तो मैं एक बनाने के लिए चाहते हैं पहले जांचें:
if (propertyInfo.PropertyType.IsAssignableFrom(value.GetType())
{
// Try/catch as above
}
else
{
// Do the manual conversion as if the exception had been thrown.
}
यह बहुत तेज़ चलता है। हालांकि, मेरी एक चिंता यह है कि IsAssignableFrom
false
कुछ प्रकार के लिए SetValue
वास्तव में सफल होगा। (यह हमारे कारण मैनुअल रूपांतरण के लिए देखने के लिए जब हम करने के लिए एक मूल्य के पूरी तरह स्थापित करने के लिए असफल हो की जरूरत नहीं है, और संभवतः होगा।)
SetValue
के लिए कल्पना का कहना है
मूल्य नहीं बदला जा सकता PropertyType
जो कि असाइनमेंट के समान बिल्कुल नहीं है।
(यदि IsAssignableFrom
रिटर्न मामलों में जहां SetValue
विफल रहता है, यह ठीक है में true
-। मैनुअल रूपांतरण अभी भी नहीं होगा)
किसी ने मुझे के लिए पुष्टि कर सकते हैं कि क्या यह संभव है या नहीं?
कृपया ऐसा वास्तविक उदाहरण दें जहां यह होता है। संभवतः आपके पास एक है, इसलिए यह एक छोटा लेकिन पूरा उदाहरण देना वास्तव में आसान होना चाहिए जो 'IsAssignableFrom' लॉग करता है और सफलतापूर्वक' SetValue 'को कॉल करता है। (यह * केवल primitives के साथ एक मुद्दा हो सकता है, जो उचित रूप से आसानी से पता लगाया जा सकता है ...) –
@ जोन मैं जो असफलता देख रहा हूं वह एक कस्टम प्रकार की संपत्ति के लिए 'स्ट्रिंग' असाइन करने का प्रयास कर रहा है जो 'स्ट्रिंग' से असाइन नहीं किया जा सकता है (लेकिन जिसके लिए हमारे पास कस्टम कनवर्टर है)। हालांकि, यह कोड किसी अन्य प्रकार को किसी भी प्रकार से सेट कर सकता है और मैं इसे तोड़ना नहीं चाहता, इसलिए मुझे सामान्य मामले में रूचि है। – Rawling
खैर मुझे आश्चर्य है कि 'SetValue' एक कस्टम कनवर्टर कॉल करेगा - लेकिन फिर, एक पूर्ण उदाहरण यह स्पष्ट करेगा। –