我必须实现的代码从网页的Ajax调用中获取一个发布的数据列表。
我知道我需要更新的对象,但是每个字段/值对都是作为字符串值而不是正确的类型。
所以我试图找出属性的类型,将值转换为新类型,然后使用反射将其应用于字段。
但是,除了字符串以外,我收到以下错误。
Invalid cast from 'System.String' to 'System.TimeSpan'.
我尝试转换的代码是;
public void Update<T>(string fieldName, string fieldValue)
{
System.Reflection.PropertyInfo propertyInfo = typeof(T).GetProperty(fieldName);
Type propertyType = propertyInfo.PropertyType;
var a = Convert.ChangeType(fieldValue, propertyType);
}
目标对象也是如此。
答案 0 :(得分:6)
没有绝对的答案适用于所有类型。但是,您可以使用TypeConverter代替转换,它通常效果更好。例如,有一个TimeSpanConverter:
public void Update<T>(string fieldName, string fieldValue)
{
System.Reflection.PropertyInfo propertyInfo = typeof(T).GetProperty(fieldName);
Type propertyType = propertyInfo.PropertyType;
TypeConverter converter = TypeDescriptor.GetConverter(type);
if (converter.CanConvertFrom(typeof(string)))
{
var a = converter.ConvertFrom(fieldValue, type);
...
}
}
答案 1 :(得分:2)
为了处理MVC(和一般的.NET)中的JSON,我使用JSON.NET。它包含在ASP.NET MVC 4项目模板中的开箱即用,否则在NuGet上可用。反序列化JSON字符串内容(通常)简单如下:
JsonConvert.DeserializeObject<Customer>(json);
如果传递的JSON不是序列化模型,则可以创建与JSON匹配的代码模型。
如果这对您的方案不起作用,您可以尝试Convert
类,如果您知道类型,则可以选择转换选项:
Convert.ToInt32(stringValue);
如果它是动态的ChangeType
方法:
Convert.ChangeType(value, conversionType);
答案 2 :(得分:1)