@@ -40,7 +40,7 @@ public class DataTableDynamicContext : DynamicObjectContext
4040 /// <para lang="zh">负责将 DataRow 与 Items 关联起来方便查找提高效率</para>
4141 /// <para lang="en">Responsible for associating DataRow with Items to facilitate lookup and improve efficiency</para>
4242 /// </summary>
43- private ConcurrentDictionary < Guid , ( IDynamicObject DynamicObject , DataRow Row ) > Caches { get ; } = new ( ) ;
43+ private readonly ConcurrentDictionary < Guid , ( IDynamicObject DynamicObject , DataRow Row ) > _dataCache = new ( ) ;
4444
4545 /// <summary>
4646 /// <para lang="zh">添加行回调委托</para>
@@ -90,7 +90,20 @@ public DataTableDynamicContext(DataTable table, Action<DataTableDynamicContext,
9090 [ ExcludeFromCodeCoverage ]
9191 Type CreateType ( )
9292 {
93- var dynamicType = EmitHelper . CreateTypeByName ( $ "BootstrapBlazor_{ nameof ( DataTableDynamicContext ) } _{ GetHashCode ( ) } ", cols , typeof ( DataTableDynamicObject ) , OnColumnCreating ) ;
93+ // Emit 生成动态类 (使用缓存)
94+ var columnNames = string . Join ( '|' , table . Columns . Cast < DataColumn > ( ) . Select ( static c => $ "{ c . ColumnName } :{ c . DataType . FullName } ") ) ;
95+ var cacheKey = $ "BootstrapBlazor-{ nameof ( DataTableDynamicContext ) } -{ columnNames } ";
96+ var dynamicType = CacheManager . GetDynamicObjectTypeByName ( cacheKey , cols , OnColumnCreating , out var cached ) ;
97+
98+ // 缓存命中时仍需调用回调以处理列属性
99+ if ( cached && AddAttributesCallback != null )
100+ {
101+ foreach ( var col in cols )
102+ {
103+ AddAttributesCallback ? . Invoke ( this , col ) ;
104+ }
105+ }
106+
94107 return dynamicType ?? throw new InvalidOperationException ( ) ;
95108 }
96109 }
@@ -136,7 +149,7 @@ public override IEnumerable<IDynamicObject> GetItems()
136149
137150 private List < IDynamicObject > BuildItems ( )
138151 {
139- Caches . Clear ( ) ;
152+ _dataCache . Clear ( ) ;
140153 var ret = new List < IDynamicObject > ( ) ;
141154 foreach ( DataRow row in DataTable . Rows )
142155 {
@@ -155,7 +168,7 @@ private List<IDynamicObject> BuildItems()
155168
156169 d . Row = row ;
157170 d . DynamicObjectPrimaryKey = Guid . NewGuid ( ) ;
158- Caches . TryAdd ( d . DynamicObjectPrimaryKey , ( d , row ) ) ;
171+ _dataCache . TryAdd ( d . DynamicObjectPrimaryKey , ( d , row ) ) ;
159172 ret . Add ( d ) ;
160173 }
161174 }
@@ -203,7 +216,7 @@ public override async Task AddAsync(IEnumerable<IDynamicObject> selectedItems)
203216 var indexOfRow = 0 ;
204217 var item = selectedItems . FirstOrDefault ( ) ;
205218
206- if ( item != null && Caches . TryGetValue ( item . DynamicObjectPrimaryKey , out var c ) )
219+ if ( item != null && _dataCache . TryGetValue ( item . DynamicObjectPrimaryKey , out var c ) )
207220 {
208221 indexOfRow = DataTable . Rows . IndexOf ( c . Row ) ;
209222 }
@@ -232,7 +245,7 @@ public override async Task AddAsync(IEnumerable<IDynamicObject> selectedItems)
232245 Items ? . Insert ( indexOfRow , dynamicObject ) ;
233246
234247 // 缓存更新数据
235- Caches . TryAdd ( dynamicObject . DynamicObjectPrimaryKey , ( dynamicObject , row ) ) ;
248+ _dataCache . TryAdd ( dynamicObject . DynamicObjectPrimaryKey , ( dynamicObject , row ) ) ;
236249 }
237250 }
238251
@@ -252,15 +265,15 @@ public override async Task<bool> DeleteAsync(IEnumerable<IDynamicObject> items)
252265 var changed = false ;
253266 foreach ( var item in items )
254267 {
255- if ( Caches . TryGetValue ( item . DynamicObjectPrimaryKey , out var row ) )
268+ if ( _dataCache . TryGetValue ( item . DynamicObjectPrimaryKey , out var row ) )
256269 {
257270 changed = true ;
258271
259272 // 删除数据源
260273 DataTable . Rows . Remove ( row . Row ) ;
261274
262275 // 清理缓存
263- Caches . TryRemove ( item . DynamicObjectPrimaryKey , out _ ) ;
276+ _dataCache . TryRemove ( item . DynamicObjectPrimaryKey , out _ ) ;
264277
265278 // 清理 Table 组件数据源
266279 Items ? . Remove ( item ) ;
@@ -289,7 +302,7 @@ public override async Task<bool> DeleteAsync(IEnumerable<IDynamicObject> items)
289302 private Task OnCellValueChanged ( IDynamicObject item , ITableColumn column , object ? val )
290303 {
291304 // 更新内部 DataRow
292- if ( Caches . TryGetValue ( item . DynamicObjectPrimaryKey , out var cacheItem ) )
305+ if ( _dataCache . TryGetValue ( item . DynamicObjectPrimaryKey , out var cacheItem ) )
293306 {
294307 cacheItem . Row [ column . GetFieldName ( ) ] = val ;
295308 Items = null ;
0 commit comments