This commit is contained in:
grzegorz.russek
2014-11-28 18:58:27 +00:00
parent 10a22759eb
commit 386059712f
4 changed files with 340 additions and 81 deletions

View File

@@ -67,9 +67,7 @@ namespace DynamORM.Helpers.Dynamics
k => k.Value.Name,
v => v.Value);
_methods = mapper.MethodsMap;
/*GetAllMembers(_type)
_methods = GetAllMembers(_type)
.Where(x => x is MethodInfo)
.Cast<MethodInfo>()
.Where(m => !((m.Name.StartsWith("set_") && m.ReturnType == typeof(void)) || m.Name.StartsWith("get_")))
@@ -86,7 +84,7 @@ namespace DynamORM.Helpers.Dynamics
{
return null;
}
});*/
});
}
/// <summary>Provides implementation for type conversion operations.
@@ -238,7 +236,7 @@ namespace DynamORM.Helpers.Dynamics
if (d != null)
{
result = d.DynamicInvoke(CompleteArguments(mi.GetParameters().ToArray(), args).ToArray());
result = d.DynamicInvoke(CompleteArguments(mi.GetParameters().ToArray(), args));
if (d.Method.ReturnType == _type && result is T)
result = new DynamicProxy<T>((T)result);
@@ -247,7 +245,7 @@ namespace DynamORM.Helpers.Dynamics
}
else if (mi != null)
{
result = mi.Invoke(_proxy, CompleteArguments(mi.GetParameters().ToArray(), args).Skip(1).ToArray());
result = mi.Invoke(_proxy, CompleteArguments(mi.GetParameters().ToArray(), args));
if (mi.ReturnType == _type && result is T)
result = new DynamicProxy<T>((T)result);
@@ -270,9 +268,9 @@ namespace DynamORM.Helpers.Dynamics
return true;
}
private IEnumerable<object> CompleteArguments(ParameterInfo[] parameters, object[] arguments)
private object[] CompleteArguments(ParameterInfo[] parameters, object[] arguments)
{
return new object[] { _proxy }.Union(arguments.Concat(parameters.Skip(arguments.Length).Select(p => p.DefaultValue)));
return arguments.Concat(parameters.Skip(arguments.Length).Select(p => p.DefaultValue)).ToArray();
}
private IEnumerable<MemberInfo> GetAllMembers(Type type)

View File

@@ -37,8 +37,6 @@ namespace DynamORM.Mapper
/// <summary>Represents type columnMap.</summary>
public class DynamicTypeMap
{
private Dictionary<MethodInfo, Delegate> _methods = null;
/// <summary>Gets mapper destination type creator.</summary>
public Type Type { get; private set; }
@@ -52,17 +50,6 @@ namespace DynamORM.Mapper
/// <remarks>Key: Column name (lower), Value: <see cref="DynamicPropertyInvoker"/>.</remarks>
public Dictionary<string, DynamicPropertyInvoker> ColumnsMap { get; private set; }
/// <summary>Gets map of methods to open instance delegates.</summary>
public Dictionary<MethodInfo, Delegate> MethodsMap
{
get
{
if (_methods == null)
_methods = CreateMethodToDelegateMap();
return _methods;
}
}
/// <summary>Gets map of properties to column.</summary>
/// <remarks>Key: Property name, Value: Column name.</remarks>
public Dictionary<string, string> PropertyMap { get; private set; }
@@ -85,29 +72,6 @@ namespace DynamORM.Mapper
CreateColumnAndPropertyMap();
}
private Dictionary<MethodInfo, Delegate> CreateMethodToDelegateMap()
{
return GetAllMembers(Type)
.Where(x => x is MethodInfo)
.Cast<MethodInfo>()
.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<string, DynamicPropertyInvoker>();