将字符串转换为对象中的类型

时间:2013-06-06 22:43:49

标签: c# c#-4.0

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

目标对象也是如此。

3 个答案:

答案 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)

要使用Convert,类型必须为IConvertible

来自MSDN

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

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

因此,您可以在致电Convert或添加try{} catch{}

之前进行检查