में कनवर्ट करें मेरे पास string
और Type
है, और मैं मान को उस Type
में परिवर्तित करना चाहता हूं।स्ट्रिंग से किसी भी मूल प्रकार
public static object StringToType(string value, Type propertyType)
{
return Convert.ChangeType(value, propertyType, CultureInfo.InvariantCulture);
}
यह एक object
है कि मैं एक संपत्ति निर्धारित मूल्य कॉल में उपयोग कर सकते हैं देता है:
public static void SetBasicPropertyValueFromString(object target,
string propName,
string value)
{
PropertyInfo prop = target.GetType().GetProperty(propName);
object converted = StringToType(value, prop.PropertyType);
prop.SetValue(target, converted, null);
}
यह सबसे बुनियादी प्रकार के लिए काम करता है, nullables को छोड़कर।
System.InvalidCastException::
[TestMethod] public void IntTest() { //working Assert.AreEqual(1, ValueHelper.StringToType("1", typeof (int))); Assert.AreEqual(123, ValueHelper.StringToType("123", typeof (int))); } [TestMethod] public void NullableIntTest() { //not working Assert.AreEqual(1, ValueHelper.StringToType("1", typeof (int?))); Assert.AreEqual(123, ValueHelper.StringToType("123", typeof (int?))); Assert.AreEqual(null, ValueHelper.StringToType(null, typeof (int?))); }
NullableIntTest
साथ पहली पंक्ति पर विफल रहता है 'System.Nullable`1 करने के लिए' System.String 'से अमान्य कलाकार [[System.Int32, mscorlib, संस्करण = 4.0 .0.0, संस्कृति = तटस्थ, PublicKeyToken = b77a5c561934e089]] '।
मुझे टाइप करने में कठिनाई हो रही है अगर प्रकार शून्य है और StringToType
विधि का व्यवहार बदल रहा है।
व्यवहार मैं के बाद हूँ:
तो स्ट्रिंग शून्य या खाली है, अशक्त लौटने के लिए, किसी और प्रति गैर-व्यर्थ प्रकार के रूप में परिवर्तित करते हैं।
परिणाम
किरिल के जवाब की तरह, एक ChangeType
केवल के साथ कॉल।
public static object StringToType(string value, Type propertyType)
{
var underlyingType = Nullable.GetUnderlyingType(propertyType);
if (underlyingType != null)
{
//an underlying nullable type, so the type is nullable
//apply logic for null or empty test
if (String.IsNullOrEmpty(value)) return null;
}
return Convert.ChangeType(value,
underlyingType ?? propertyType,
CultureInfo.InvariantCulture);
}
आप अपने विधि सामान्य बना सकते हैं: 'जनता स्थिर वस्तु StringToType (स्ट्रिंग मान) जहां टी: struct' ... –
@KarelFrajtak ना, क्योंकि जिस तरह से यह कहा जाता है की, दूसरा कोड टुकड़ा देखते हैं। 'prop.PropertyType' प्रतिबिंब से है, इसलिए रनटाइम तक ज्ञात नहीं है। – weston
आपकी 'if' चेक बिल्कुल सही नहीं है। आपके विशेष मामले * किसी भी * जेनेरिक प्रकार के लिए नहीं होना चाहिए, यह * शून्य * 0N'के लिए * बस * होना चाहिए क्योंकि उन्हें अलग-अलग बॉक्स किया गया है। – Servy