获取属性类型并转换泛型

时间:2014-10-03 18:12:15

标签: c# generics

我需要转换类型泛型的值..但我需要获取转换属性的类型...我怎么能这样做?

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));
}

2 个答案:

答案 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方法使用的重载!