Мне нужно преобразовать значение типа 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));
}
Хотя я рекомендую вам придерживаться @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
в качестве аргумента.
Если вы конвертируете из словаря, начните с использования 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!
object
преобразование происходит только во время выполнения. Альтернативой является ненужное метакодирование