根据属性类型动态转换对象

时间:2015-08-31 18:46:32

标签: c#

我有一个JObject,我从一个代表自定义对象的调整器的一个JSON字符串反序列化,调整器。

然后我将该对象与数据库中已存在的对象合并以创建更新的对象。我这样做是通过反射循环遍历属性并将它们分配给属性名称匹配。

我的问题是JValue无法隐式转换为目标类型,我必须手动转换它。 有没有办法可以动态转换对象?我可以获得需要转换为的类型。

这是我的Model Binder:

  public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
    {
        JObject jsonObj = JsonConvert.DeserializeObject(actionContext.Request.Content.ReadAsStringAsync().Result) as JObject;

        Adjuster dbAdjuster = new Adjuster();
        Type adjType = dbAdjuster.GetType();
        PropertyInfo[] props = adjType.GetProperties();

        dbAdjuster = AdjusterFactory.GetAdjuster(Convert.ToInt32(jsonObj["ID"].ToString()));

        foreach (var prop in jsonObj.Properties() )
        {
            foreach (PropertyInfo info in props)
            {
                if (prop.Name == info.Name && prop.Name != "ID")
                {
                    if (info.GetValue(dbAdjuster) is string)
                    {
                        info.SetValue(dbAdjuster, Convert.ToString(prop.Value));
                        break;
                    }
                    //continue for every type
                }
                else
                {
                    break;
                }

            }
        }

        bindingContext.Model = dbAdjuster;
        return true;
    }

2 个答案:

答案 0 :(得分:4)

您可以使用Convert.ChangeType这样做:

property.SetValue(item, Convert.ChangeType(valueToConvert, property.PropertyType));

答案 1 :(得分:1)

请参阅:Generic type conversion FROM string

TConverter.ChangeType<T>(StringValue);  

public static class TConverter
{
    public static T ChangeType<T>(object value)
    {
        return (T)ChangeType(typeof(T), value);
    }
    public static object ChangeType(Type t, object value)
    {
        TypeConverter tc = TypeDescriptor.GetConverter(t);
        return tc.ConvertFrom(value);
    }
    public static void RegisterTypeConverter<T, TC>() where TC : TypeConverter
    {

        TypeDescriptor.AddAttributes(typeof(T), new TypeConverterAttribute(typeof(TC)));
    }
}