本文整理汇总了C#中System.Linq.Expressions.MethodCallExpression.TryGetArgument方法的典型用法代码示例。如果您正苦于以下问题:C# MethodCallExpression.TryGetArgument方法的具体用法?C# MethodCallExpression.TryGetArgument怎么用?C# MethodCallExpression.TryGetArgument使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类System.Linq.Expressions.MethodCallExpression
的用法示例。
在下文中一共展示了MethodCallExpression.TryGetArgument方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: VisitMethodCall
//.........这里部分代码省略.........
var source = Visit(m.GetArgument("source"));
Type elemType = source.Type.ElementType();
ParameterExpression pe = Expression.Parameter(elemType);
var lambdaCast = Expression.Lambda(Expression.Convert(pe, paramTypes[0]), pe);
return Expression.Call((query ? miSelectQ : miSelectE).MakeGenericMethod(elemType, paramTypes[0]), source, lambdaCast);
}
if (ReflectionTools.MethodEqual(mi, miOfTypeE) || ReflectionTools.MethodEqual(mi, miOfTypeQ))
{
var source = Visit(m.GetArgument("source"));
Type elemType = source.Type.ElementType();
ParameterExpression pe = Expression.Parameter(elemType);
var lambdaIs = Expression.Lambda(Expression.TypeIs(pe, paramTypes[0]), pe);
var lambdaCast = Expression.Lambda(Expression.Convert(pe, paramTypes[0]), pe);
var where = Expression.Call((query ? miWhereQ : miWhereE).MakeGenericMethod(elemType), source, lambdaIs);
return Expression.Call((query ? miSelectQ : miSelectE).MakeGenericMethod(elemType, paramTypes[0]), where, lambdaCast);
}
if (mi.Name.Contains("Last"))
{
var source = Visit(m.GetArgument("source"));
var predicate = (LambdaExpression)Visit(m.TryGetArgument("predicate").StripQuotes());
Expression reverse = Expression.Call((query ? miReverseQ : miReverseE).MakeGenericMethod(paramTypes[0]), source);
if(predicate != null)
reverse = Expression.Call((query ? miWhereQ : miWhereE).MakeGenericMethod(paramTypes[0]), reverse, predicate);
MethodInfo mEqFirst = query ?
mi.Name.Contains("OrDefault") ? miFirstOrDefaultQ : miFirstQ :
mi.Name.Contains("OrDefault") ? miFirstOrDefaultE : miFirstE;
return Expression.Call(mEqFirst.MakeGenericMethod(paramTypes[0]), reverse);
}
if (ReflectionTools.MethodEqual(mi, miElementAtE) || ReflectionTools.MethodEqual(mi, miElementAtOrDefaultE) ||
ReflectionTools.MethodEqual(mi, miElementAtQ) || ReflectionTools.MethodEqual(mi, miElementAtOrDefaultQ))
{
bool def = ReflectionTools.MethodEqual(mi, miElementAtOrDefaultE) || ReflectionTools.MethodEqual(mi, miElementAtOrDefaultQ);
var source = Visit(m.GetArgument("source"));
var index = Visit(m.GetArgument("index"));
MethodInfo first = (def ? (query ? miFirstOrDefaultQ : miFirstOrDefaultE) :
(query ? miFirstQ : miFirstE)).MakeGenericMethod(paramTypes[0]);
MethodInfo skip = (query ? miSkipQ : miSkipE).MakeGenericMethod(paramTypes[0]);
return Visit(Expression.Call(first, Expression.Call(skip, source, index)));
}
if(ReflectionTools.MethodEqual(mi, miSkipE) ||ReflectionTools.MethodEqual(mi, miSkipQ))
{
示例2: VisitMethodCall
protected override Expression VisitMethodCall(MethodCallExpression m)
{
if (m.Method.DeclaringType == typeof(Queryable) ||
m.Method.DeclaringType == typeof(Enumerable) ||
m.Method.DeclaringType == typeof(EnumerableUniqueExtensions))
{
switch (m.Method.Name)
{
case "Where":
return this.BindWhere(m.Type, m.GetArgument("source"), m.GetArgument("predicate").StripQuotes());
case "Select":
return this.BindSelect(m.Type, m.GetArgument("source"), m.GetArgument("selector").StripQuotes());
case "SelectMany":
if (m.Arguments.Count == 2)
return this.BindSelectMany(m.Type, m.GetArgument("source"), m.GetArgument("selector").StripQuotes(), null);
else
return this.BindSelectMany(m.Type, m.GetArgument("source"), m.GetArgument("collectionSelector").StripQuotes(), m.TryGetArgument("resultSelector").StripQuotes());
case "Join":
return this.BindJoin(
m.Type, m.GetArgument("outer"), m.GetArgument("inner"),
m.GetArgument("outerKeySelector").StripQuotes(),
m.GetArgument("innerKeySelector").StripQuotes(),
m.GetArgument("resultSelector").StripQuotes());
case "OrderBy":
return this.BindOrderBy(m.Type, m.GetArgument("source"), m.GetArgument("keySelector").StripQuotes(), OrderType.Ascending);
case "OrderByDescending":
return this.BindOrderBy(m.Type, m.GetArgument("source"), m.GetArgument("keySelector").StripQuotes(), OrderType.Descending);
case "ThenBy":
return this.BindThenBy(m.GetArgument("source"), m.GetArgument("keySelector").StripQuotes(), OrderType.Ascending);
case "ThenByDescending":
return this.BindThenBy(m.GetArgument("source"), m.GetArgument("keySelector").StripQuotes(), OrderType.Descending);
case "GroupBy":
return this.BindGroupBy(m.Type, m.GetArgument("source"),
m.GetArgument("keySelector").StripQuotes(),
m.GetArgument("elementSelector").StripQuotes());
case "Count":
return this.BindCount(m.Type, m.GetArgument("source"));
case "DefaultIfEmpty":
return Visit(m.GetArgument("source"));
case "Any":
return this.BindAny(m.Type, m.GetArgument("source"));
case "All":
return this.BindAll(m.Type, m.GetArgument("source"), m.GetArgument("predicate").StripQuotes());
case "Contains":
return this.BindContains(m.Type, m.GetArgument("source"), m.TryGetArgument("item") ?? m.GetArgument("value"));
case "Sum":
case "Min":
case "Max":
case "Average":
return this.BindAggregate(m.Type, m.Method.Name.ToEnum<AggregateFunction>(),
m.GetArgument("source"), m.TryGetArgument("selector").StripQuotes());
case "First":
case "FirstOrDefault":
case "Single":
case "SingleOrDefault":
return BindUniqueRow(m.Type, m.Method.Name.ToEnum<UniqueFunction>(),
m.GetArgument("source"), m.TryGetArgument("predicate").StripQuotes());
case "FirstEx":
case "SingleEx":
case "SingleOrDefaultEx":
return BindUniqueRow(m.Type, m.Method.Name.RemoveEnd(2).ToEnum<UniqueFunction>(),
m.GetArgument("collection"), m.TryGetArgument("predicate").StripQuotes());
case "Distinct":
return BindDistinct(m.Type, m.GetArgument("source"));
case "Take":
return BindTake(m.Type, m.GetArgument("source"), m.GetArgument("count"));
case "Skip":
return BindSkip(m.Type, m.GetArgument("source"), m.GetArgument("count"));
}
}
if (m.Method.Name == "Mixin" && m.Method.GetParameters().Length == 0)
{
var obj = Visit(m.Object);
var me = obj as MetaExpression;
if (me != null && me.Meta is CleanMeta)
{
CleanMeta cm = (CleanMeta)me.Meta;
var mixinType = m.Method.GetGenericArguments().Single();
return new MetaExpression(mixinType, new CleanMeta(null, cm.PropertyRoutes.Select(a => a.Add(mixinType)).ToArray()));
}
}
if (m.Method.DeclaringType == typeof(LinqHints) || m.Method.DeclaringType == typeof(LinqHintEntities))
return Visit(m.Arguments[0]);
if (m.Method.DeclaringType == typeof(Lite) && m.Method.Name == "ToLite")
return MakeCleanMeta(m.Type, Visit(m.Arguments[0]));
if (m.Method.DeclaringType == typeof(Math) &&
(m.Method.Name == "Abs" ||
m.Method.Name == "Ceiling" ||
m.Method.Name == "Floor" ||
m.Method.Name == "Round" ||
m.Method.Name == "Truncate"))
return MakeCleanMeta(m.Type, Visit(m.Arguments[0]));
//.........这里部分代码省略.........