Получение типа свойства и преобразование универсального

1

Мне нужно преобразовать значение типа generic.. но мне нужно получить тип свойства для преобразования... как я могу это сделать?

public static T ConvertToClass<T>(this Dictionary<string, string> model)
{
    Type type = typeof(T);
    var obj = Activator.CreateInstance(type);
    foreach (var item in model)
    {                              
       type.GetProperty(item.Key).SetValue(obj, item.Value.DynamicType</*TYPE OF PROPERTY*/>());
    }
    return (T)obj;
}
public static T DynamicType<T>(this string value)
{
    return (T)Convert.ChangeType(value, typeof(T));
}
Теги:
generics

2 ответа

1
Лучший ответ

Хотя я рекомендую вам придерживаться @Aravol ответа,

Если вам действительно нужен тип свойства, есть свойство (извините за избыточность) в PropertyInfo которое может вам помочь:

public static T ConvertToClass<T>(this Dictionary<string, object> model)
{
    Type type = typeof(T);
    var obj = Activator.CreateInstance(type);
    foreach (var item in model)
    {                              
       PropertyInfo property = type.GetProperty(item.Key);
       Type propertyType = property.PropertyType;
       property.SetValue(obj, item.Value.ConvertToType(propertyType));
    }
    return (T)obj;
}

public static object ConvertToType(this string value, Type t)
{
     return Convert.ChangeType(value, t);
} 

Обратите внимание, что я модифицировал DynamicType чтобы он мог получить Type в качестве аргумента.

0

Если вы конвертируете из словаря, начните с использования Dictionary<string, object> - все происходит от object, даже от структур.

этот код будет работать просто с помощью SetValue потому что метод принимает object и, следовательно, не будет заботиться о типе до выполнения. Дайте ему неправильный тип во время выполнения, и он будет генерировать исключение.

public static T ConvertToClass<T>(this Dictionary<string, object> model)
{
    Type type = typeof(T);
    var obj = Activator.CreateInstance(type);
    foreach (var item in model)
    {                              
       type.GetProperty(item.Key).SetValue(obj, item.Value);
    }
    return (T)obj;
}

Будьте осторожны с этим кодом - не используя более сложные перегрузки и утверждения try-catch, он будет очень подвержен ошибкам времени выполнения, которые не имеют большого смысла из контекста других методов - многие сериализации могут использовать непубличные сеттеров или ограничены полями. Читайте о перегрузках, используемых методами Reflection!

  • 0
    Да, показать исключение при поиске свойства int. Мне нужно преобразовать элемент. Значение для типа свойства
  • 0
    В этом случае вам не нужно. Поскольку все и что угодно может быть передано как object преобразование происходит только во время выполнения. Альтернативой является ненужное метакодирование

Ещё вопросы

Сообщество Overcoder
Наверх
Меню