Mam string
i Type
, i chcę zwrócić wartość string
przekonwertowany na ten Type
.Konwertuj z ciąg na dowolny podstawowy typ
public static object StringToType(string value, Type propertyType)
{
return Convert.ChangeType(value, propertyType, CultureInfo.InvariantCulture);
}
ta zwraca object
że można używać w nieruchomości wywołania wartości zadanej:
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);
}
Działa to dla większości podstawowych typów, z wyjątkiem nullables.
[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
nie na pierwszej linii z:
System.InvalidCastException: Nieprawidłowy odlana z 'System.String' do „System.Nullable`1 [[System.Int32, mscorlib, Version = 4,0 .0,0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] '.
Mam trudności z określeniem, czy typ jest zerowy i zmienia zachowanie metody StringToType
.
Zachowanie Jestem po:
Jeśli ciąg jest zerowy lub pusty, powrót null, jeszcze konwertować jak na non wartości pustych typu.
Wynik
jak odpowiedź Cyryla, tylko z jednym ChangeType
wezwanie.
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);
}
Można uczynić metoda rodzajowa: 'public static obiekt StringToType (wartość string) gdzie T: struct' ... –
@KarelFrajtak Na, ze względu na sposób to się nazywa, patrz kod drugiego fragmentu. 'prop.PropertyType' pochodzi z odbicia, więc nie jest znane aż do czasu wykonania. – weston
Twoja próba "jeśli" nie jest właściwa. Twoje specjalne przypadki nie powinny być dla * dowolnego * rodzaju ogólnego, powinno to być * tylko * dla 'Nullable' ponieważ są one oznaczone inaczej. –
Servy