diff --git a/DynamORM.sln b/DynamORM.sln index 715dae6..7883d46 100644 --- a/DynamORM.sln +++ b/DynamORM.sln @@ -29,6 +29,18 @@ Global {63963ED7-9C78-4672-A4D4-339B6E825503}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {63963ED7-9C78-4672-A4D4-339B6E825503}.Release|Mixed Platforms.Build.0 = Release|Any CPU {63963ED7-9C78-4672-A4D4-339B6E825503}.Release|x86.ActiveCfg = Release|Any CPU + {A64D2052-D0CD-488E-BF05-E5952615D926}.Debug|Any CPU.ActiveCfg = Debug|x86 + {A64D2052-D0CD-488E-BF05-E5952615D926}.Debug|Any CPU.Build.0 = Debug|x86 + {A64D2052-D0CD-488E-BF05-E5952615D926}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {A64D2052-D0CD-488E-BF05-E5952615D926}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {A64D2052-D0CD-488E-BF05-E5952615D926}.Debug|x86.ActiveCfg = Debug|x86 + {A64D2052-D0CD-488E-BF05-E5952615D926}.Debug|x86.Build.0 = Debug|x86 + {A64D2052-D0CD-488E-BF05-E5952615D926}.Release|Any CPU.ActiveCfg = Release|x86 + {A64D2052-D0CD-488E-BF05-E5952615D926}.Release|Any CPU.Build.0 = Release|x86 + {A64D2052-D0CD-488E-BF05-E5952615D926}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {A64D2052-D0CD-488E-BF05-E5952615D926}.Release|Mixed Platforms.Build.0 = Release|x86 + {A64D2052-D0CD-488E-BF05-E5952615D926}.Release|x86.ActiveCfg = Release|x86 + {A64D2052-D0CD-488E-BF05-E5952615D926}.Release|x86.Build.0 = Release|x86 {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Debug|Any CPU.Build.0 = Debug|Any CPU {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -39,16 +51,6 @@ Global {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Release|Mixed Platforms.Build.0 = Release|Any CPU {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Release|x86.ActiveCfg = Release|Any CPU - {A64D2052-D0CD-488E-BF05-E5952615D926}.Debug|Any CPU.ActiveCfg = Debug|x86 - {A64D2052-D0CD-488E-BF05-E5952615D926}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {A64D2052-D0CD-488E-BF05-E5952615D926}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {A64D2052-D0CD-488E-BF05-E5952615D926}.Debug|x86.ActiveCfg = Debug|x86 - {A64D2052-D0CD-488E-BF05-E5952615D926}.Debug|x86.Build.0 = Debug|x86 - {A64D2052-D0CD-488E-BF05-E5952615D926}.Release|Any CPU.ActiveCfg = Release|x86 - {A64D2052-D0CD-488E-BF05-E5952615D926}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {A64D2052-D0CD-488E-BF05-E5952615D926}.Release|Mixed Platforms.Build.0 = Release|x86 - {A64D2052-D0CD-488E-BF05-E5952615D926}.Release|x86.ActiveCfg = Release|x86 - {A64D2052-D0CD-488E-BF05-E5952615D926}.Release|x86.Build.0 = Release|x86 {F747AA57-BEA7-4FB8-B371-546296789AEF}.Debug|Any CPU.ActiveCfg = Debug|x86 {F747AA57-BEA7-4FB8-B371-546296789AEF}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {F747AA57-BEA7-4FB8-B371-546296789AEF}.Debug|Mixed Platforms.Build.0 = Debug|x86 @@ -60,6 +62,9 @@ Global {F747AA57-BEA7-4FB8-B371-546296789AEF}.Release|x86.ActiveCfg = Release|x86 {F747AA57-BEA7-4FB8-B371-546296789AEF}.Release|x86.Build.0 = Release|x86 EndGlobalSection + GlobalSection(MonoDevelopProperties) = preSolution + StartupItem = AmalgamationTool\AmalgamationTool.csproj + EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection diff --git a/DynamORM/DynamORM.csproj b/DynamORM/DynamORM.csproj index 120421d..1d5af67 100644 --- a/DynamORM/DynamORM.csproj +++ b/DynamORM/DynamORM.csproj @@ -29,6 +29,10 @@ 4 true true + False + Auto + 4194304 + AnyCPU PdbOnly @@ -38,9 +42,12 @@ prompt 4 true - false true bin\Release\DynamORM.xml + False + Auto + 4194304 + AnyCPU False diff --git a/DynamORM/Helpers/Dynamics/DynamicProxy.cs b/DynamORM/Helpers/Dynamics/DynamicProxy.cs index 92a28f5..9907414 100644 --- a/DynamORM/Helpers/Dynamics/DynamicProxy.cs +++ b/DynamORM/Helpers/Dynamics/DynamicProxy.cs @@ -67,7 +67,9 @@ namespace DynamORM.Helpers.Dynamics k => k.Value.Name, v => v.Value); - _methods = GetAllMembers(_type) + _methods = mapper.MethodsMap; + + /*GetAllMembers(_type) .Where(x => x is MethodInfo) .Cast() .Where(m => !((m.Name.StartsWith("set_") && m.ReturnType == typeof(void)) || m.Name.StartsWith("get_"))) @@ -84,7 +86,7 @@ namespace DynamORM.Helpers.Dynamics { return null; } - }); + });*/ } /// Provides implementation for type conversion operations. @@ -236,7 +238,7 @@ namespace DynamORM.Helpers.Dynamics if (d != null) { - result = d.DynamicInvoke(CompleteArguments(mi.GetParameters().ToArray(), args)); + result = d.DynamicInvoke(CompleteArguments(mi.GetParameters().ToArray(), args).ToArray()); if (d.Method.ReturnType == _type && result is T) result = new DynamicProxy((T)result); @@ -245,7 +247,7 @@ namespace DynamORM.Helpers.Dynamics } else if (mi != null) { - result = mi.Invoke(_proxy, CompleteArguments(mi.GetParameters().ToArray(), args)); + result = mi.Invoke(_proxy, CompleteArguments(mi.GetParameters().ToArray(), args).Skip(1).ToArray()); if (mi.ReturnType == _type && result is T) result = new DynamicProxy((T)result); @@ -268,9 +270,9 @@ namespace DynamORM.Helpers.Dynamics return true; } - private object[] CompleteArguments(ParameterInfo[] parameters, object[] arguments) + private IEnumerable CompleteArguments(ParameterInfo[] parameters, object[] arguments) { - return arguments.Concat(parameters.Skip(arguments.Length).Select(p => p.DefaultValue)).ToArray(); + return new object[] { _proxy }.Union(arguments.Concat(parameters.Skip(arguments.Length).Select(p => p.DefaultValue))); } private IEnumerable GetAllMembers(Type type) @@ -320,7 +322,6 @@ namespace DynamORM.Helpers.Dynamics object res; TryInvokeMethod("Dispose", out res, new object[] { }); - _methods.Clear(); _properties.Clear(); _methods = null; diff --git a/DynamORM/Mapper/DynamicTypeMap.cs b/DynamORM/Mapper/DynamicTypeMap.cs index aeb96ea..0339bd2 100644 --- a/DynamORM/Mapper/DynamicTypeMap.cs +++ b/DynamORM/Mapper/DynamicTypeMap.cs @@ -37,6 +37,8 @@ namespace DynamORM.Mapper /// Represents type columnMap. public class DynamicTypeMap { + private Dictionary _methods = null; + /// Gets mapper destination type creator. public Type Type { get; private set; } @@ -50,6 +52,17 @@ namespace DynamORM.Mapper /// Key: Column name (lower), Value: . public Dictionary ColumnsMap { get; private set; } + /// Gets map of methods to open instance delegates. + public Dictionary MethodsMap + { + get + { + if (_methods == null) + _methods = CreateMethodToDelegateMap(); + return _methods; + } + } + /// Gets map of properties to column. /// Key: Property name, Value: Column name. public Dictionary PropertyMap { get; private set; } @@ -72,6 +85,29 @@ namespace DynamORM.Mapper CreateColumnAndPropertyMap(); } + private Dictionary CreateMethodToDelegateMap() + { + return GetAllMembers(Type) + .Where(x => x is MethodInfo) + .Cast() + .Where(m => !((m.Name.StartsWith("set_") && m.ReturnType == typeof(void)) || m.Name.StartsWith("get_"))) + .Where(m => !m.IsStatic && !m.IsGenericMethod) + .ToDictionary( + k => k, + v => + { + try + { + return Delegate.CreateDelegate(Expression.GetDelegateType(new Type[] { v.DeclaringType }.Union(v.GetParameters().Select(t => t.ParameterType).Concat(new[] { v.ReflectedType })).ToArray()), v); + ////return Delegate.CreateDelegate(Expression.GetDelegateType(v.GetParameters().Select(t => t.ParameterType).Concat(new[] { v.ReflectedType }).ToArray()), _proxy, v.Name); + } + catch (ArgumentException) + { + return null; + } + }); + } + private void CreateColumnAndPropertyMap() { var columnMap = new Dictionary();