我需要转换类型泛型的值..但我需要获取转换属性的类型...我怎么能这样做?
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));
}
答案 0 :(得分: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
作为参数。
答案 1 :(得分: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方法使用的重载!