|
|
@ -235,41 +235,48 @@ namespace Coldairarrow.Util |
|
|
|
|
|
|
|
private static Expression<TDelegate> GetExtendSelectExpre<TBase, TResult, TDelegate>(Expression<TDelegate> expression) |
|
|
|
{ |
|
|
|
NewExpression newBody = Expression.New(typeof(TResult)); |
|
|
|
MemberInitExpression oldExpression = (MemberInitExpression)expression.Body; |
|
|
|
|
|
|
|
ParameterExpression[] oldParamters = expression.Parameters.ToArray(); |
|
|
|
List<string> existsProperties = new List<string>(); |
|
|
|
oldExpression.Bindings.ToList().ForEach(aBinding => |
|
|
|
try |
|
|
|
{ |
|
|
|
existsProperties.Add(aBinding.Member.Name); |
|
|
|
}); |
|
|
|
NewExpression newBody = Expression.New(typeof(TResult)); |
|
|
|
MemberInitExpression oldExpression = (MemberInitExpression)expression.Body; |
|
|
|
|
|
|
|
List<MemberBinding> newBindings = new List<MemberBinding>(); |
|
|
|
typeof(TBase).GetProperties().Where(x => !existsProperties.Contains(x.Name)).ToList().ForEach(aProperty => |
|
|
|
{ |
|
|
|
if (typeof(TResult).GetMembers().Any(x => x.Name == aProperty.Name)) |
|
|
|
ParameterExpression[] oldParamters = expression.Parameters.ToArray(); |
|
|
|
List<string> existsProperties = new List<string>(); |
|
|
|
oldExpression.Bindings.ToList().ForEach(aBinding => |
|
|
|
{ |
|
|
|
MemberBinding newMemberBinding = null; |
|
|
|
var valueExpre = Expression.Property(oldParamters[0], aProperty.Name); |
|
|
|
if (typeof(TBase).IsAssignableFrom(typeof(TResult))) |
|
|
|
{ |
|
|
|
newMemberBinding = Expression.Bind(aProperty, valueExpre); |
|
|
|
} |
|
|
|
else |
|
|
|
existsProperties.Add(aBinding.Member.Name); |
|
|
|
}); |
|
|
|
|
|
|
|
List<MemberBinding> newBindings = new List<MemberBinding>(); |
|
|
|
typeof(TBase).GetProperties().Where(x => !existsProperties.Contains(x.Name)).ToList().ForEach(aProperty => |
|
|
|
{ |
|
|
|
if (typeof(TResult).GetMembers().Any(x => x.Name == aProperty.Name)) |
|
|
|
{ |
|
|
|
newMemberBinding = Expression.Bind(typeof(TResult).GetProperty(aProperty.Name), valueExpre); |
|
|
|
MemberBinding newMemberBinding = null; |
|
|
|
var valueExpre = Expression.Property(oldParamters[0], aProperty.Name); |
|
|
|
if (typeof(TBase).IsAssignableFrom(typeof(TResult))) |
|
|
|
{ |
|
|
|
newMemberBinding = Expression.Bind(aProperty, valueExpre); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
newMemberBinding = Expression.Bind(typeof(TResult).GetProperty(aProperty.Name), valueExpre); |
|
|
|
} |
|
|
|
newBindings.Add(newMemberBinding); |
|
|
|
} |
|
|
|
newBindings.Add(newMemberBinding); |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
newBindings.AddRange(oldExpression.Bindings); |
|
|
|
newBindings.AddRange(oldExpression.Bindings); |
|
|
|
|
|
|
|
var body = Expression.MemberInit(newBody, newBindings.ToArray()); |
|
|
|
var resExpression = Expression.Lambda<TDelegate>(body, oldParamters); |
|
|
|
var body = Expression.MemberInit(newBody, newBindings.ToArray()); |
|
|
|
var resExpression = Expression.Lambda<TDelegate>(body, oldParamters); |
|
|
|
|
|
|
|
return resExpression; |
|
|
|
return resExpression; |
|
|
|
} |
|
|
|
catch(Exception ex) |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#endregion
|
|
|
|