4

我必须实现的代码从网页的 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);
    }

目标对象也是如此。

4

3 回答 3

11

没有适用于所有类型的绝对答案。但是,您可以使用TypeConverter而不是 Convert,它通常效果更好。例如,有一个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);
        ...
    }
}
于 2013-06-06T22:59:45.167 回答
2

为了使用Convert类型需要IConvertible

来自MSDN

 For the conversion to succeed, value must implement the IConvertible interface

TimeSpan没有实现它......

所以你可以在调用Convert或添加之前检查try{} catch{}

于 2013-06-06T22:52:42.143 回答
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);
于 2013-06-06T23:21:35.167 回答