From 3fd4e44abcab2aaae139ec762eaef224c2b02312 Mon Sep 17 00:00:00 2001 From: Quin Lynch Date: Fri, 14 Jul 2023 11:34:31 -0300 Subject: [PATCH] Update TypeArgumentUtils.cs --- .../Utils/TypeArgumentUtils.cs | 39 ++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/src/EdgeDB.Net.Driver/Utils/TypeArgumentUtils.cs b/src/EdgeDB.Net.Driver/Utils/TypeArgumentUtils.cs index f2891635..bc13e016 100644 --- a/src/EdgeDB.Net.Driver/Utils/TypeArgumentUtils.cs +++ b/src/EdgeDB.Net.Driver/Utils/TypeArgumentUtils.cs @@ -30,7 +30,32 @@ public TypeArgumentBuilder() { _type = typeof(T); - var param = Expression.Parameter(_type, "value"); + if (RuntimeFeature.IsDynamicCodeCompiled) + _factory = CompileExpressionBuilder(_type); + else + _factory = GetReflectionBuilder(_type); + } + + private static Func> GetReflectionBuilder(Type type) + { + var propMap = EdgeDBPropertyMapInfo.Create(type); + + return value => + { + var dict = new Dictionary(); + + foreach(var prop in propMap.Map) + { + dict.Add(prop.Key, prop.Value.PropertyInfo.GetValue(value)); + } + + return dict; + }; + } + + private static Func> CompileExpressionBuilder(Type type) + { + var param = Expression.Parameter(type, "value"); var dictExp = Expression.Variable(typeof(Dictionary), "dict"); var body = new List() @@ -38,23 +63,27 @@ public TypeArgumentBuilder() Expression.Assign(dictExp, Expression.New(typeof(Dictionary))) }; - var propMap = EdgeDBPropertyMapInfo.Create(_type); + var propMap = EdgeDBPropertyMapInfo.Create(type); - foreach(var prop in propMap.Map) + foreach (var prop in propMap.Map) { + Expression value = prop.Value.Type.IsValueType + ? Expression.TypeAs(Expression.MakeMemberAccess(param, prop.Value.PropertyInfo), typeof(object)) + : Expression.MakeMemberAccess(param, prop.Value.PropertyInfo); + body.Add( Expression.Call( dictExp, _dictAddMethod, Expression.Constant(prop.Key), - Expression.MakeMemberAccess(param, prop.Value.PropertyInfo) + value ) ); } body.Add(dictExp); - _factory = Expression.Lambda>>( + return Expression.Lambda>>( Expression.Block( typeof(IDictionary), new ParameterExpression[] { dictExp },