public void SetMember(object obj, EnumMemberValue enumMemberValue) { PropertyInfo propertyInfo = null; object currentObj = obj; for (int i = 0; i < this._memberNames.Length; i++) { if (i == this._memberNames.Length - 1) { propertyInfo = currentObj.GetType().GetProperty(this._memberNames[i]); } else { currentObj = currentObj.GetType().GetProperty(this._memberNames[i]).GetValue(currentObj, null); if (currentObj == null) { return; } } } if (propertyInfo == null) { return; } object value; if (enumMemberValue == EnumMemberValue.NewValue) { value = this.NewValue; } else { value = this.OldValue; } try { if (propertyInfo.CanWrite) { if (propertyInfo.PropertyType.IsEnum) { propertyInfo.SetValue(currentObj, Enum.Parse(propertyInfo.PropertyType, value.ToString()), null); } else { propertyInfo.SetValue(currentObj, value, null); } } } catch (Exception ex) { Debug.Assert(false, ex.Message); } }
/// <summary> /// 为指定的对象设置属性(Property)值 /// </summary> /// <param name="obj"></param> /// <param name="enumMemberValue"></param> public void SetMember(object obj, EnumMemberValue enumMemberValue) { PropertyInfo propertyInfo = null; object currentObj = obj; for (int i = 0; i < this._memberNames.Length; i++) { //如果已经到了属性(Property)路径的底层 if (i == this._memberNames.Length - 1) { propertyInfo = currentObj.GetType().GetProperty(this._memberNames[i]); } else { //如果还没有到路径底层 currentObj = currentObj.GetType().GetProperty(this._memberNames[i]).GetValue(currentObj, null); //此时currentObj有可能为null,如窗体元素的字体,就可能发生为null的情况 //但是照正常逻辑,应该不会出现这种情况,这里还是做个判断,防止程序意外出错 if (currentObj == null) { return; } } } if (propertyInfo == null) { return; } object value; if (enumMemberValue == EnumMemberValue.NewValue) { value = this.NewValue; } else { value = this.OldValue; } try { if (propertyInfo.CanWrite) { if (propertyInfo.PropertyType.IsEnum) { propertyInfo.SetValue(currentObj, Enum.Parse(propertyInfo.PropertyType, value.ToString()), null); } else { propertyInfo.SetValue(currentObj, value, null); //忘了当时为什么要加Convert.ChangeType //try //{ //在调用Convert.ChangeType 时,被转换的对象必须实现 IConvertible //propertyInfo.SetValue(currentObj, Convert.ChangeType(value, propertyInfo.PropertyType), null); //} //catch (InvalidCastException ex) //{ // Debug.Assert(false, ex.Message); //} } } } catch (Exception ex) { Debug.Assert(false, ex.Message); } }