Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit bc29be2

Browse files
committed
Add more optimized expression overloads for setting fields
1 parent 391dad4 commit bc29be2

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

src/ServiceStack.Text/Common/JsDelegates.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ namespace ServiceStack.Text.Common
2828

2929
public delegate void SetPropertyDelegate(object instance, object propertyValue);
3030

31+
public delegate void SetPropertyDelegateRef(ref object instance, object propertyValue);
32+
33+
public delegate void SetPropertyDelegateRefGeneric<T>(ref T instance, object value);
34+
3135
public delegate object ParseStringDelegate(string stringValue);
3236

3337
public delegate object ConvertObjectDelegate(object fromObject);

src/ServiceStack.Text/Reflection/StaticAccessors.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
using System.Reflection;
1616
using System.Threading;
1717
using ServiceStack.Text;
18+
using ServiceStack.Text.Common;
1819
#if !XBOX
1920
using System.Linq.Expressions;
2021
#endif
@@ -181,6 +182,25 @@ public static Action<T, object> GetValueSetter<T>(this PropertyInfo propertyInfo
181182
).Compile();
182183
}
183184

185+
public static Action<object, object> GetValueSetter(this FieldInfo fieldInfo, Type instanceType)
186+
{
187+
var instance = Expression.Parameter(typeof(object), "i");
188+
var argument = Expression.Parameter(typeof(object), "a");
189+
190+
var field = instanceType != fieldInfo.DeclaringType
191+
? Expression.Field(Expression.TypeAs(instance, fieldInfo.DeclaringType), fieldInfo)
192+
: Expression.Field(Expression.Convert(instance, instanceType), fieldInfo);
193+
194+
var setterCall = Expression.Assign(
195+
field,
196+
Expression.Convert(argument, fieldInfo.FieldType));
197+
198+
return Expression.Lambda<Action<object, object>>
199+
(
200+
setterCall, instance, argument
201+
).Compile();
202+
}
203+
184204
public static Action<T, object> GetValueSetter<T>(this FieldInfo fieldInfo)
185205
{
186206
var instance = Expression.Parameter(typeof(T), "i");
@@ -199,6 +219,25 @@ public static Action<T, object> GetValueSetter<T>(this FieldInfo fieldInfo)
199219
setterCall, instance, argument
200220
).Compile();
201221
}
222+
223+
public static SetPropertyDelegateRefGeneric<T> GetValueSetterGenericRef<T>(this FieldInfo fieldInfo)
224+
{
225+
var instance = Expression.Parameter(typeof(T).MakeByRefType(), "i");
226+
var argument = Expression.Parameter(typeof(object), "a");
227+
228+
var field = typeof(T) != fieldInfo.DeclaringType
229+
? Expression.Field(Expression.TypeAs(instance, fieldInfo.DeclaringType), fieldInfo)
230+
: Expression.Field(instance, fieldInfo);
231+
232+
var setterCall = Expression.Assign(
233+
field,
234+
Expression.Convert(argument, fieldInfo.FieldType));
235+
236+
return Expression.Lambda<SetPropertyDelegateRefGeneric<T>>
237+
(
238+
setterCall, instance, argument
239+
).Compile();
240+
}
202241
#endif
203242

204243
}

0 commit comments

Comments
 (0)