@@ -38,8 +38,7 @@ public ChangeTrackingContext(ChangedValueDescriptorCollection collection) =>
3838 /// <param name="description">描述</param>
3939 /// <param name="valueBeforeChange">变更前的值。范例:this.Name</param>
4040 /// <param name="valueAfterChange">变更后的值。范例:newEntity.Name</param>
41- public void Add < TValue > ( string propertyName , string description , TValue valueBeforeChange ,
42- TValue valueAfterChange )
41+ public void Add < TValue > ( string propertyName , string description , TValue valueBeforeChange , TValue valueAfterChange )
4342 {
4443 if ( Equals ( valueBeforeChange , valueAfterChange ) )
4544 return ;
@@ -53,34 +52,20 @@ public void Add<TValue>(string propertyName, string description, TValue valueBef
5352 /// <summary>
5453 /// 添加
5554 /// </summary>
56- /// <typeparam name="TObject">领域对象类型</typeparam>
5755 /// <param name="leftObj">左对象</param>
5856 /// <param name="rightObj">右对象</param>
59- public void Add < TObject > ( IChangeTrackable < TObject > leftObj , TObject rightObj ) where TObject : IDomainObject
57+ public void Add ( IChangeTrackable leftObj , object rightObj )
6058 {
6159 if ( Equals ( leftObj , null ) )
6260 return ;
6361 if ( Equals ( rightObj , null ) )
6462 return ;
65- _changedValueCollection . AddRange ( leftObj . GetChanges ( rightObj ) ) ;
66- }
63+ if ( leftObj . GetType ( ) != rightObj . GetType ( ) )
64+ throw new InvalidOperationException ( $ "无法进行对象比较,类型不匹配: { leftObj . GetType ( ) . FullName } ≠ { rightObj . GetType ( ) . FullName } " ) ;
6765
68- /// <summary>
69- /// 添加
70- /// </summary>
71- /// <typeparam name="TObject">领域对象类型</typeparam>
72- /// <typeparam name="TProperty">属性类型</typeparam>
73- /// <typeparam name="TValue">值类型</typeparam>
74- /// <param name="expression">属性表达式。范例:t => t.Name</param>
75- /// <param name="obj">领域对象</param>
76- /// <param name="newValue">新值。范例:newEntity.Name</param>
77- public void Add < TObject , TProperty , TValue > ( Expression < Func < TObject , TProperty > > expression , TObject obj , TValue newValue ) where TObject : IDomainObject
78- {
79- var member = Lambdas . GetMemberExpression ( expression ) ;
80- var name = Lambdas . GetMemberName ( member ) ;
81- var desc = Reflection . Reflections . GetDisplayNameOrDescription ( member . Member ) ;
82- var value = member . Member . GetPropertyValue ( obj ) ;
83- Add ( name , desc , Conv . To < TValue > ( value ) , newValue ) ;
66+ // 执行变更比较,并将变更结果添加到集合中
67+ var changes = leftObj . GetChanges ( rightObj ) ;
68+ _changedValueCollection . AddRange ( changes ) ;
8469 }
8570
8671 /// <summary>
@@ -89,23 +74,44 @@ public void Add<TObject, TProperty, TValue>(Expression<Func<TObject, TProperty>>
8974 /// <typeparam name="TObject">领域对象类型</typeparam>
9075 /// <param name="leftObjs">左对象列表</param>
9176 /// <param name="rightObjs">右对象列表</param>
92- public void Add < TObject > ( IEnumerable < IChangeTrackable < TObject > > leftObjs , IEnumerable < TObject > rightObjs )
77+ public void Add < TObject > ( IEnumerable < IChangeTrackable > leftObjs , IEnumerable < TObject > rightObjs )
9378 where TObject : IDomainObject
9479 {
9580 if ( Equals ( leftObjs , null ) )
9681 return ;
9782 if ( Equals ( rightObjs , null ) )
9883 return ;
84+
85+ // 转换为列表,避免重复遍历
9986 var leftObjList = leftObjs . ToList ( ) ;
10087 var rightObjList = rightObjs . ToList ( ) ;
10188
102- var length = leftObjList . Capacity > rightObjList . Count
103- ? rightObjList . Count
104- : leftObjList . Count ;
89+ // 确保列表长度一致
90+ var length = Math . Min ( leftObjList . Count , rightObjList . Count ) ;
91+
10592 for ( var i = 0 ; i < length ; i ++ )
10693 Add ( leftObjList [ i ] , rightObjList [ i ] ) ;
10794 }
10895
96+ /// <summary>
97+ /// 添加
98+ /// </summary>
99+ /// <typeparam name="TObject">领域对象类型</typeparam>
100+ /// <typeparam name="TProperty">属性类型</typeparam>
101+ /// <typeparam name="TValue">值类型</typeparam>
102+ /// <param name="expression">属性表达式。范例:t => t.Name</param>
103+ /// <param name="obj">领域对象</param>
104+ /// <param name="newValue">新值。范例:newEntity.Name</param>
105+ public void Add < TObject , TProperty , TValue > ( Expression < Func < TObject , TProperty > > expression , TObject obj , TValue newValue )
106+ where TObject : IDomainObject
107+ {
108+ var member = Lambdas . GetMemberExpression ( expression ) ;
109+ var name = Lambdas . GetMemberName ( member ) ;
110+ var desc = Reflection . Reflections . GetDisplayNameOrDescription ( member . Member ) ;
111+ var value = member . Member . GetPropertyValue ( obj ) ;
112+ Add ( name , desc , Conv . To < TValue > ( value ) , newValue ) ;
113+ }
114+
109115 /// <summary>
110116 /// 填充
111117 /// </summary>
@@ -131,4 +137,4 @@ public void Add<TObject>(IEnumerable<IChangeTrackable<TObject>> leftObjs, IEnume
131137 /// 输出字符串
132138 /// </summary>
133139 public override string ToString ( ) => Output ( ) ;
134- }
140+ }
0 commit comments