本文整理汇总了C#中System.Linq.Expressions.Expression.To方法的典型用法代码示例。如果您正苦于以下问题:C# Expression.To方法的具体用法?C# Expression.To怎么用?C# Expression.To使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类System.Linq.Expressions.Expression
的用法示例。
在下文中一共展示了Expression.To方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: CreateAdaptExpression
protected Expression CreateAdaptExpression(Expression source, Type destinationType, CompileArgument arg)
{
if (source.Type == destinationType && (arg.Settings.ShallowCopyForSameType == true || arg.MapType == MapType.Projection))
return source.To(destinationType);
var lambda = arg.Context.Config.CreateInlineMapExpression(source.Type, destinationType, arg.MapType, arg.Context);
var exp = lambda.Apply(source);
if (arg.Settings.DestinationTransforms.Transforms.ContainsKey(exp.Type))
{
var transform = arg.Settings.DestinationTransforms.Transforms[exp.Type];
var replacer = new ParameterExpressionReplacer(transform.Parameters, exp);
var newExp = replacer.Visit(transform.Body);
exp = replacer.ReplaceCount >= 2 ? Expression.Invoke(transform, exp) : newExp;
}
return exp.To(destinationType);
}
示例2: CreateInlineExpression
protected override Expression CreateInlineExpression(Expression source, CompileArgument arg)
{
if (arg.DestinationType.GetTypeInfo().IsAssignableFrom(source.Type.GetTypeInfo()) && (arg.Settings.ShallowCopyForSameType == true || arg.MapType == MapType.Projection))
return source.To(arg.DestinationType);
var sourceElementType = source.Type.ExtractCollectionType();
var destinationElementType = arg.DestinationType.ExtractCollectionType();
var method = (from m in typeof (Enumerable).GetMethods()
where m.Name == "Select"
let p = m.GetParameters()[1]
where p.ParameterType.GetGenericTypeDefinition() == typeof (Func<,>)
select m).First().MakeGenericMethod(sourceElementType, destinationElementType);
var p1 = Expression.Parameter(sourceElementType);
var adapt = CreateAdaptExpression(p1, destinationElementType, arg);
if (adapt == p1)
return source;
return Expression.Call(method, source, Expression.Lambda(adapt, p1));
}
示例3: DictionaryFn
private static Expression DictionaryFn(Expression source, IMemberModel destinationMember, CompileArgument arg)
{
var dictType = source.Type.GetDictionaryType();
if (dictType == null)
return null;
var strategy = arg.Settings.NameMatchingStrategy;
var destinationMemberName = strategy.DestinationMemberNameConverter(destinationMember.Name);
var key = Expression.Constant(destinationMemberName);
var args = dictType.GetGenericArguments();
if (strategy.SourceMemberNameConverter != NameMatchingStrategy.Identity)
{
var method = typeof (Extensions).GetMethods().First(m => m.Name == "FlexibleGet").MakeGenericMethod(args[1]);
return Expression.Call(method, source.To(dictType), key, Expression.Constant(strategy.SourceMemberNameConverter));
}
else
{
var method = typeof(Extensions).GetMethods().First(m => m.Name == "GetValueOrDefault").MakeGenericMethod(args);
return Expression.Call(method, source.To(dictType), key);
}
}
示例4: CreateBlockExpressionBody
protected Expression CreateBlockExpressionBody(Expression source, Expression destination, CompileArgument arg)
{
if (arg.MapType == MapType.Projection)
throw new InvalidOperationException(
$"Mapping is invalid for projection: TSource: {arg.SourceType} TDestination: {arg.DestinationType}");
var result = Expression.Variable(arg.DestinationType);
Expression assign = Expression.Assign(result, destination ?? CreateInstantiationExpression(source, arg));
var set = CreateBlockExpression(source, result, arg);
if (arg.Settings.AfterMappingFactories.Count > 0)
{
//var result = adapt(source);
//action(source, result);
var actions = new List<Expression> { set };
foreach (var afterMappingFactory in arg.Settings.AfterMappingFactories)
{
var afterMapping = afterMappingFactory(arg);
var args = afterMapping.Parameters;
Expression invoke;
if (args[0].Type.IsReferenceAssignableFrom(source.Type) && args[1].Type.IsReferenceAssignableFrom(result.Type))
{
var replacer = new ParameterExpressionReplacer(args, source, result);
invoke = replacer.Visit(afterMapping.Body);
}
else
{
invoke = Expression.Invoke(afterMapping, source.To(args[0].Type), result.To(args[1].Type));
}
actions.Add(invoke);
}
set = Expression.Block(actions);
}
if (arg.Settings.PreserveReference == true &&
!arg.SourceType.GetTypeInfo().IsValueType &&
!arg.DestinationType.GetTypeInfo().IsValueType)
{
//using (var scope = new MapContextScope()) {
// var dict = scope.Context.Reference;
// object cache;
// if (dict.TryGetValue(source, out cache))
// result = (TDestination)cache;
// else {
// result = new TDestination();
// dict.Add(source, (object)result);
// result.Prop1 = adapt(source.Prop1);
// result.Prop2 = adapt(source.Prop2);
// }
//}
var scope = Expression.Variable(typeof(MapContextScope));
var newScope = Expression.Assign(scope, Expression.New(typeof(MapContextScope)));
var dict = Expression.Variable(typeof(Dictionary<object, object>));
var refContext = Expression.Property(scope, "Context");
var refDict = Expression.Property(refContext, "References");
var assignDict = Expression.Assign(dict, refDict);
var refAdd = Expression.Call(dict, "Add", null, Expression.Convert(source, typeof(object)), Expression.Convert(result, typeof(object)));
var setResultAndCache = Expression.Block(assign, refAdd, set);
var cached = Expression.Variable(typeof(object));
var tryGetMethod = typeof(Dictionary<object, object>).GetMethod("TryGetValue", new[] { typeof(object), typeof(object).MakeByRefType() });
var checkHasRef = Expression.Call(dict, tryGetMethod, source, cached);
var setResult = Expression.IfThenElse(
checkHasRef,
ExpressionEx.Assign(result, cached),
setResultAndCache);
var usingBody = Expression.Block(new[] { cached, dict }, assignDict, setResult);
var dispose = Expression.Call(scope, "Dispose", null);
set = Expression.Block(new[] { scope }, newScope, Expression.TryFinally(usingBody, dispose));
}
else
{
set = Expression.Block(assign, set);
}
//TDestination result;
//if (source == null)
// result = default(TDestination);
//else
// result = adapt(source);
//return result;
if (!arg.SourceType.GetTypeInfo().IsValueType || arg.SourceType.IsNullable())
{
var compareNull = Expression.Equal(source, Expression.Constant(null, source.Type));
set = Expression.IfThenElse(
compareNull,
Expression.Assign(result, destination ?? Expression.Constant(arg.DestinationType.GetDefault(), arg.DestinationType)),
set);
}
return Expression.Block(new[] { result }, set, result);
}