2015-08-31 2 views
0

У меня есть JObject, который я десериализую из строки JSON из HTTP-сообщения, представляющего пользовательский объект Adjuster.Динамически конвертировать объект по типу свойства

Затем я объединяю этот объект с тем, что уже существует в базе данных для создания обновленного объекта. Я делаю это с отражением, перебирающим свойства и назначающим их там, где имена свойств совпадают.

Проблема заключается в том, что JValue не может быть неявно преобразован в тип адресата, мне нужно его вручную преобразовать. Есть ли способ, которым я могу динамически конвертировать объекты? Я могу получить тип, который нужно будет преобразовать.

Вот моя модель 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; 
    } 
+1

AutoMapper имеет интерфейс для 'TypeConverter', это помогает? https://github.com/AutoMapper/AutoMapper/wiki/Custom-type-converters – Eris

ответ

1

Вы можете сделать это с помощью Convert.ChangeType так:

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

Да, это именно то, что я пытаюсь предотвратить. – joelforsyth

+1

@joelforsyth О, простите, теперь я понимаю. Ваш вопрос только стал более интересным! –

+0

@joelforsyth Спасибо, ты только что открыл мой разум! Удалил все мои else ifs и заменил его одной строкой в ​​отредактированном ответе, работает как шарм! :) –

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))); 
    } 
} 
Смежные вопросы