反射某个类时,对于类的属性,字段。已知有已知的方法,未知有未知的写法。
而SetValues赋值则需要类型转换
情况1,该属性类型是已知类型,例如:int
int value=500;
property.SetValue(obj,value,null);
这里需要注意value值的类型必须和属性类型一致,否则会抛出TargetException异常。
情况2,该属性类型是已知类型,原值是其他类型。例如:目标类型为int,值为string
string value="500";
property.SetValue(obj,int.TryParse(value),null);//类型转换
情况3,该属性类型是未知非泛型类型,不确定目标类型,如何进行类型转换
object value="500";
property.SetValue(obj,Convert.ChangeType(value,property.PropertyType),null);//类型转换
这是在非泛型情况,
若是泛型则加个判断吧
1 if (!property.PropertyType.IsGenericType) 2 { 3 //非泛型 4 property.SetValue(obj, string.IsNullOrEmpty(value) ? null : Convert.ChangeType(value, property.PropertyType), null); 5 } 6 else 7 { 8 //泛型Nullable<> 9 Type genericTypeDefinition = property.PropertyType.GetGenericTypeDefinition(); 10 if (genericTypeDefinition == typeof(Nullable<>)) 11 { 12 property.SetValue(obj, string.IsNullOrEmpty(value) ? null : Convert.ChangeType(value, Nullable.GetUnderlyingType(property.PropertyType)), null); 13 } 14 }
贴个案例源代码:
1 var discount = "111"; 2 Type t = obj.GetType(); 3 PropertyInfo pi = t.GetProperty("discount"); 4 if (pi != null) 5 pi.SetValue(obj, Convert.ChangeType(discount, pi.PropertyType), null);