object GetParameExpressionValue(Expression expression) { //只能处理常量 if (expression is ConstantExpression) { ConstantExpression cExp = (ConstantExpression)expression; return(cExp.Value); } else if (expression is MemberExpression)//按属性访问 { var m = expression as MemberExpression; if (m.Expression != null) { if (m.Expression.NodeType == ExpressionType.Parameter) { string name = m.Member.Name; var filed2 = TypeCache.GetProperties(m.Expression.Type, true)[name]; return(new ExpressionValueObj { Value = FormatFieldPrefix(m.Expression.Type, filed2.MapingName), IsMember = true }); } else { var v = ConstantValueVisitor.GetMemberExpressionValue(m); return(v); } } } //按编译 return(Expression.Lambda(expression).Compile().DynamicInvoke()); }
object GetParameExpressionValue(Expression expression, out bool isConstant) { isConstant = false; //只能处理常量 if (expression is ConstantExpression) { isConstant = true; ConstantExpression cExp = (ConstantExpression)expression; return(cExp.Value); } else if (expression is MemberExpression)//按属性访问 { var m = expression as MemberExpression; if (m.Expression != null) { if (m.Expression.NodeType == ExpressionType.Parameter) { string name = m.Member.Name; var filed2 = TypeCache.GetProperties(m.Expression.Type, true)[name]; return(new ExpressionValueObj { Value = FormatFieldPrefix(m.Expression.Type, __DBAdapter.FieldNameFormat(filed2)), IsMember = true, member = m.Member }); } else { return(ConstantValueVisitor.GetMemberExpressionValue(m, out isConstant)); } } return(ConstantValueVisitor.GetMemberExpressionValue(m, out isConstant)); } //按编译 return(Expression.Lambda(expression).Compile().DynamicInvoke()); }
internal SelectFieldInfo GetSelectField(bool isSelect, Expression expressionBody, bool withTablePrefix, params Type[] types) { SelectFieldInfo item; if (isSelect) { var cacheKey = GetSelectFieldCacheKey(isSelect, expressionBody, withTablePrefix, types); var cache = !string.IsNullOrEmpty(cacheKey); //cache = false; if (cache) { #region cache var a = _GetSelectFieldCache.TryGetValue(cacheKey, out item); if (a) { if (expressionBody is NewExpression) { var newExp = expressionBody as NewExpression; foreach (var kv in item.parame) { var exp = newExp.Arguments[Convert.ToInt32(kv.Value)]; if (exp is MethodCallExpression) { var mExp = exp as MethodCallExpression; if (mExp.Arguments.Count > 0) { string mName; getSelectMethodCall(exp, out mName, 0, false);//转换为参数 } } else { var obj = ConstantValueVisitor.GetParameExpressionValue(exp); __Visitor.AddParame(kv.Key, obj); } } } return(item); } else { item = _GetSelectField(isSelect, expressionBody, withTablePrefix, types); //item.expression = expressionBody; _GetSelectFieldCache[cacheKey] = item; return(item); } #endregion } } item = _GetSelectField(isSelect, expressionBody, withTablePrefix, types); return(item); }
/// <summary> /// 解析选择的字段 /// </summary> /// <param name="isSelect">查询字段时按属性名生成别名</param> /// <param name="expressionBody"></param> /// <param name="withTablePrefix">是否生按表生成前辍,关联时用 如Table__Name</param> /// <param name="types"></param> /// <returns></returns> internal SelectFieldInfo GetSelectField(bool isSelect, Expression expressionBody, bool withTablePrefix, params Type[] types) { var allFields = new Dictionary <Type, IgnoreCaseDictionary <Attribute.FieldAttribute> >(); allFields.Add(__MainType, TypeCache.GetProperties(__MainType, true)); foreach (var t in types) { if (!allFields.ContainsKey(t)) { allFields.Add(t, TypeCache.GetProperties(t, true)); } } if (expressionBody is ParameterExpression)//选择所有字段 { var resultFields = new List <Attribute.FieldMapping>(); foreach (var item in allFields[expressionBody.Type].Values) { var item2 = item.GetFieldMapping(__DBAdapter, GetPrefix(item.ModelType), false, ""); resultFields.Add(item2); } var selectFieldItem = new SelectFieldInfo(resultFields); return(selectFieldItem); } else if (expressionBody is NewExpression)//按匿名对象 { var resultFields = new List <Attribute.FieldMapping>(); #region 匿名对象 var newExpression = expressionBody as NewExpression; for (int i = 0; i < newExpression.Arguments.Count(); i++) { var item = newExpression.Arguments[i]; var memberName = newExpression.Members[i].Name; if (item is MethodCallExpression)//group用 { var methodCallExpression = item as MethodCallExpression; string methodMember; var methodQuery = getSelectMethodCall(methodCallExpression, out methodMember, i); var f = new Attribute.FieldAttribute() { ModelType = __MainType, MemberName = memberName, PropertyType = item.Type }; var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, methodQuery); f2.MethodName = methodCallExpression.Method.Name; resultFields.Add(f2); } else if (item is BinaryExpression) { var field = getSeletctBinary(item); var f = new Attribute.FieldAttribute() { ModelType = __MainType, MemberName = "", PropertyType = item.Type }; var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, field); resultFields.Add(f2); } else if (item is ConstantExpression)//常量 { var constantExpression = item as ConstantExpression; var f = new Attribute.FieldAttribute() { ModelType = __MainType, MemberName = "", PropertyType = item.Type }; var value = constantExpression.Value + ""; if (!value.IsNumber()) { value = string.Format("'{0}'", value); } var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, value); //f.FieldQuery = new Attribute.FieldQuery() { MemberName = memberName, FieldName = value, MethodName = "" }; resultFields.Add(f2); } else if (item is MemberExpression) { var memberExpression = item as MemberExpression;//转换为属性访问表达式 if (memberExpression.Expression.NodeType == ExpressionType.Constant) { string parName = __DBAdapter.GetParamName("p", i); //newExpressionParame.Add(parName, i); var obj = ConstantValueVisitor.GetParameExpressionValue(item); var f2 = new Attribute.FieldAttribute() { ModelType = __MainType, PropertyType = item.Type }; var f3 = f2.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, parName); //f2.FieldQuery = new Attribute.FieldQuery() { MemberName = memberName, FieldName = parName, MethodName = "" }; resultFields.Add(f3); __Visitor.AddParame(parName, obj); continue; } else if (memberExpression.Member.ReflectedType.Name.StartsWith("<>f__AnonymousType")) { //按匿名对象属性,视图关联时用 var f2 = new Attribute.FieldAttribute() { MemberName = memberExpression.Member.Name, PropertyType = item.Type }; var f3 = f2.GetFieldMapping(__DBAdapter, GetPrefix(memberExpression.Expression.Type), withTablePrefix, memberName); resultFields.Add(f3); continue; } //按属性 Attribute.FieldAttribute f; var a2 = allFields[memberExpression.Expression.Type].TryGetValue(memberExpression.Member.Name, out f); if (!a2) { throw new CRLException("找不到可筛选的属性" + memberExpression.Member.Name + " 在" + memberExpression.Expression.Type); } Attribute.FieldMapping _f2; if (memberName != memberExpression.Member.Name)//按有别名算 { _f2 = f.GetFieldMapping(__DBAdapter, GetPrefix(f.ModelType), withTablePrefix, memberName); } else { //字段名和属性名不一样时才生成别名 //todo 属性别名不一样时,查询应返回属性名 string fieldName = ""; if (isSelect)//查询字段时按属性名生成别名 { if (!string.IsNullOrEmpty(f.MapingName)) { fieldName = f.MemberName; } } _f2 = f.GetFieldMapping(__DBAdapter, GetPrefix(f.ModelType), withTablePrefix, fieldName); } //f.FieldQuery = new Attribute.FieldQuery() { MemberName = memberName, FieldName = f.MapingName, MethodName = "" }; resultFields.Add(_f2); } else { throw new CRLException("不支持此语法解析:" + item); } } #endregion var selectFieldItem = new SelectFieldInfo(resultFields); return(selectFieldItem); } else if (expressionBody is MethodCallExpression) { #region 方法 var method = expressionBody as MethodCallExpression; var f = new Attribute.FieldAttribute() { ModelType = __MainType, MemberName = "", PropertyType = expressionBody.Type }; string methodMember; var methodQuery = getSelectMethodCall(expressionBody, out methodMember, 0); var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, "", methodQuery); f2.MethodName = method.Method.Name; #endregion var selectFieldItem = new SelectFieldInfo(f2); return(selectFieldItem); } else if (expressionBody is BinaryExpression) { var field = getSeletctBinary(expressionBody); var f = new Attribute.FieldAttribute() { ModelType = __MainType, MemberName = "", PropertyType = expressionBody.Type }; var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, "", field); var selectFieldItem = new SelectFieldInfo(f2); return(selectFieldItem); } else if (expressionBody is ConstantExpression) { var constant = (ConstantExpression)expressionBody; var f = new Attribute.FieldAttribute() { ModelType = __MainType, MemberName = "", PropertyType = expressionBody.Type }; var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, "", constant.Value + ""); var selectFieldItem = new SelectFieldInfo(f2); return(selectFieldItem); } else if (expressionBody is UnaryExpression) { var unaryExpression = expressionBody as UnaryExpression; return(GetSelectField(false, unaryExpression.Operand, withTablePrefix, types)); } else if (expressionBody is MemberExpression)//按成员 { #region MemberExpression var mExp = (MemberExpression)expressionBody; if (mExp.Expression.Type.BaseType == typeof(object)) { //按匿名对象属性,视图关联时用 var _f = new Attribute.FieldAttribute() { MemberName = mExp.Member.Name, PropertyType = mExp.Type }; var f3 = _f.GetFieldMapping(__DBAdapter, GetPrefix(mExp.Expression.Type), withTablePrefix, mExp.Member.Name); return(new SelectFieldInfo(f3)); } CRL.Attribute.FieldAttribute f; var a = allFields[mExp.Expression.Type].TryGetValue(mExp.Member.Name, out f); if (!a) { throw new CRLException("找不到可筛选的属性" + mExp.Member.Name + " 在" + mExp.Expression.Type); } var f2 = f.GetFieldMapping(__DBAdapter, GetPrefix(f.ModelType), withTablePrefix, ""); return(new SelectFieldInfo(f2)); #endregion } else { throw new CRLException("不支持此语法解析:" + expressionBody); } }
CRLExpression.CRLExpression MethodCallExpressionHandler(Expression exp, ExpressionType?nodeType = null, bool firstLevel = false) { #region methodCall MethodCallExpression mcExp = (MethodCallExpression)exp; var arguments = new List <object>(); var allArguments = new List <Expression>(mcExp.Arguments); int argsIndex = 0; Expression firstArgs; bool isLambdaQueryJoinExt = false; if (mcExp.Object == null) //区分静态方法还是实例方法 { firstArgs = allArguments[0]; //like b.Name.IsNull("22") argsIndex = 1; if (firstArgs.Type.Name.Contains("LambdaQueryJoin")) { isLambdaQueryJoinExt = true; } } else { firstArgs = mcExp.Object; //like b.Id.ToString() if (allArguments.Count > 0 && (allArguments[0] is MemberExpression)) //like ids.Contains(b.Id) { var mexp2 = allArguments[0] as MemberExpression; var firstArgsM = firstArgs as MemberExpression; //var par2 = (ParameterExpression)mexp2.Expression; if (mexp2.Expression is ParameterExpression && firstArgsM.Expression is ConstantExpression) { firstArgs = allArguments[0]; argsIndex = 1; allArguments.Add(mcExp.Object); if (firstArgs.Type.Name.Contains("LambdaQueryJoin")) { isLambdaQueryJoinExt = true; } } } } #region MethodCallExpression //bool isConstantMethod = false; MemberExpression memberExpression; string methodField = ""; string memberName = ""; string methodName = mcExp.Method.Name; if (firstArgs is ParameterExpression || isLambdaQueryJoinExt) { var exp2 = mcExp.Arguments[1] as UnaryExpression; var type = exp2.Operand.GetType(); var p = type.GetProperty("Body"); var exp3 = p.GetValue(exp2.Operand, null) as Expression; methodField = RouteExpressionHandler(exp3).SqlOut; memberName = ""; } else if (firstArgs is UnaryExpression)//like a.Code.Count() { memberExpression = (firstArgs as UnaryExpression).Operand as MemberExpression; memberName = memberExpression.Member.Name; var field = TypeCache.GetProperties(memberExpression.Expression.Type, true)[memberName]; memberName = __DBAdapter.FieldNameFormat(field); methodField = FormatFieldPrefix(memberExpression.Expression.Type, memberName); } else if (firstArgs is BinaryExpression) { var be = firstArgs as BinaryExpression; methodField = BinaryExpressionHandler(be.Left, be.Right, be.NodeType).Data.ToString(); } else if (firstArgs is MemberExpression) { //like a.Code memberExpression = firstArgs as MemberExpression; memberName = memberExpression.Member.Name; var type = memberExpression.Expression.Type; if (type.IsSubclassOf(typeof(IModel))) { var field = TypeCache.GetProperties(type, true)[memberExpression.Member.Name]; memberName = __DBAdapter.FieldNameFormat(field); } if (memberExpression.Expression.NodeType == ExpressionType.Parameter) { methodField = FormatFieldPrefix(memberExpression.Expression.Type, memberName); //var allConstant = true; for (int i = argsIndex; i < allArguments.Count; i++) { bool isConstant2; var obj = GetParameExpressionValue(allArguments[i], out isConstant2); arguments.Add(obj); } } else { //like Convert.ToDateTime(times) var obj = ConstantValueVisitor.GetParameExpressionValue(firstArgs); arguments.Add(obj); for (int i = argsIndex; i < allArguments.Count; i++) { bool isConstant2; var obj2 = GetParameExpressionValue(allArguments[i], out isConstant2); arguments.Add(obj2); } } } else if (firstArgs is ConstantExpression)//按常量 { //like DateTime.Parse("2016-02-11 12:56"), //isConstantMethod = true; var obj = ConstantValueVisitor.GetParameExpressionValue(firstArgs); arguments.Add(obj); } //else //{ // throw new CRLException("不支持此语法解析:" + args); //} if (nodeType == null) { nodeType = ExpressionType.Equal; } if (string.IsNullOrEmpty(methodField)) { //当是常量转换方法 var method = mcExp.Method; object obj = null; if (method.IsStatic) //like DateTime.Parse("2016-02-11") { if (method.IsGenericMethod) //扩展方法,like public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value) { var valueObj = (ExpressionValueObj)arguments[1]; if (valueObj == null) { throw new Exception("不支持此语法:" + mcExp); } memberName = valueObj.member.Name; arguments = new List <object>() { arguments[0] }; methodField = valueObj.Value.ToString(); goto lable1; } else { obj = method.Invoke(null, arguments.ToArray()); } } else//like time.AddDays(1) { if (arguments.Count == 0) { throw new Exception("未能解析" + exp); } var args1 = arguments.First(); arguments.RemoveAt(0); if (arguments.Count > 0) { if (arguments[0] is ExpressionValueObj) { throw new Exception("不支持这样的语法:" + exp); } } obj = method.Invoke(args1, arguments.ToArray()); } var exp2 = new CRLExpression.CRLExpression() { Type = CRLExpression.CRLExpressionType.Value, Data = obj }; return(exp2); } lable1: var methodInfo = new CRLExpression.MethodCallObj() { Args = arguments, ExpressionType = nodeType.Value, MemberName = memberName, MethodName = methodName, MemberQueryName = methodField }; methodInfo.ReturnType = mcExp.Type; #endregion var exp4 = new CRLExpression.CRLExpression() { Type = CRLExpression.CRLExpressionType.MethodCall, Data = methodInfo }; return(exp4); #endregion }
SelectFieldInfo GetNewExpressionMember(bool isSelect, Dictionary <Type, IgnoreCaseDictionary <Attribute.FieldInnerAttribute> > allFields, bool withTablePrefix, List <MemberBindingObj> members) { var resultFields = new List <Attribute.FieldMapping>(); var i = -1; foreach (var args in members) { i += 1; var item = args.Expression; var memberName = args.Member.Name; label1: if (item is MethodCallExpression)//group用 { var methodCallExpression = item as MethodCallExpression; string methodMember; var methodQuery = getSelectMethodCall(methodCallExpression, out methodMember, i); var f = new Attribute.FieldInnerAttribute() { ModelType = __MainType, MemberName = memberName, PropertyType = item.Type }; var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, methodQuery); f2.MethodName = methodCallExpression.Method.Name; resultFields.Add(f2); } else if (item is BinaryExpression) { var field = getSeletctBinary(item); var f = new Attribute.FieldInnerAttribute() { ModelType = __MainType, MemberName = "", PropertyType = item.Type }; var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, field); resultFields.Add(f2); } else if (item is ConstantExpression)//常量 { var constantExpression = item as ConstantExpression; var f = new Attribute.FieldInnerAttribute() { ModelType = __MainType, MemberName = "", PropertyType = item.Type }; var value = constantExpression.Value + ""; if (!StringHelper.IsDouble(value)) { value = string.Format("'{0}'", value); } var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, value); //f.FieldQuery = new Attribute.FieldQuery() { MemberName = memberName, FieldName = value, MethodName = "" }; resultFields.Add(f2); } else if (item is MemberExpression) { var memberExpression = item as MemberExpression;//转换为属性访问表达式 if (memberExpression.Expression.NodeType == ExpressionType.Constant) { string parName = __DBAdapter.GetParamName("p", i); //newExpressionParame.Add(parName, i); var obj = ConstantValueVisitor.GetParameExpressionValue(item); var f2 = new Attribute.FieldInnerAttribute() { ModelType = __MainType, PropertyType = item.Type }; var f3 = f2.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, parName); //f2.FieldQuery = new Attribute.FieldQuery() { MemberName = memberName, FieldName = parName, MethodName = "" }; resultFields.Add(f3); __Visitor.AddParame(parName, obj); continue; } else if (memberExpression.Member.ReflectedType.Name.StartsWith("<>f__AnonymousType")) { //按匿名对象属性,视图关联时用 var f2 = new Attribute.FieldInnerAttribute() { MemberName = memberExpression.Member.Name, PropertyType = item.Type }; var f3 = f2.GetFieldMapping(__DBAdapter, GetPrefix(memberExpression.Expression.Type), withTablePrefix, memberName); resultFields.Add(f3); continue; } //按属性 Attribute.FieldInnerAttribute f; var a2 = allFields[memberExpression.Expression.Type].TryGetValue(memberExpression.Member.Name, out f); if (!a2) { throw new CRLException("找不到可筛选的属性" + memberExpression.Member.Name + " 在" + memberExpression.Expression.Type); } Attribute.FieldMapping _f2; if (memberName != memberExpression.Member.Name)//按有别名算 { _f2 = f.GetFieldMapping(__DBAdapter, GetPrefix(f.ModelType), withTablePrefix, memberName); } else { //字段名和属性名不一样时才生成别名 //todo 属性别名不一样时,查询应返回属性名 string fieldName = ""; if (isSelect)//查询字段时按属性名生成别名 { if (!string.IsNullOrEmpty(f.MapingName)) { fieldName = f.MemberName; } } _f2 = f.GetFieldMapping(__DBAdapter, GetPrefix(f.ModelType), withTablePrefix, fieldName); } //f.FieldQuery = new Attribute.FieldQuery() { MemberName = memberName, FieldName = f.MapingName, MethodName = "" }; resultFields.Add(_f2); } else if (item is UnaryExpression) { var unaryExpression = item as UnaryExpression; item = unaryExpression.Operand; goto label1; } else { throw new CRLException("不支持此语法解析:" + item); } } var selectFieldItem = new SelectFieldInfo(resultFields); return(selectFieldItem); }
CRLExpression.CRLExpression MethodCallExpressionHandler(Expression exp, ExpressionType?nodeType = null, bool firstLevel = false) { #region methodCall MethodCallExpression mcExp = (MethodCallExpression)exp; var arguments = new List <object>(); var allArguments = mcExp.Arguments; int argsIndex = 0; Expression firstArgs; bool isLambdaQueryJoinExt = false; if (mcExp.Method.IsStatic) //区分静态方法还是实例方法 { firstArgs = allArguments[0]; //like b.Name.IsNull("22") argsIndex = 1; if (firstArgs.Type.Name.Contains("LambdaQueryJoin")) { isLambdaQueryJoinExt = true; } } else { firstArgs = mcExp.Object;//like b.Id.ToString() } #region 缓存处理 效率并不高 //MethodCallExpressionCacheItem methodCache; //string key = ""; //if (SettingConfig.UseLambdaCache&& false) //{ // key = __PrefixsAllKey + mcExp + nodeType; // var exists = MethodCallExpressionCache.TryGetValue(key, out methodCache); // if (exists) // { // if (!methodCache.isConstantMethod) // { // var methodCall = methodCache.CRLExpression.Data as CRLExpression.MethodCallObj; // if (methodCall.Args.Count > 0) // { // for (int i = argsIndex; i < allArguments.Count; i++) // { // bool isConstant1; // var obj = GetParameExpressionValue(allArguments[i], out isConstant1); // arguments.Add(obj); // } // methodCall.Args = arguments; // } // } // methodCache.CRLExpression.SqlOut = ""; // return methodCache.CRLExpression; // } //} #endregion #region MethodCallExpression //bool isConstantMethod = false; MemberExpression memberExpression; string methodField = ""; string memberName = ""; string methodName = mcExp.Method.Name; if (firstArgs is ParameterExpression || isLambdaQueryJoinExt) { var exp2 = mcExp.Arguments[1] as UnaryExpression; var type = exp2.Operand.GetType(); var p = type.GetProperty("Body"); var exp3 = p.GetValue(exp2.Operand, null) as Expression; methodField = RouteExpressionHandler(exp3).SqlOut; memberName = ""; } else if (firstArgs is UnaryExpression)//like a.Code.Count() { memberExpression = (firstArgs as UnaryExpression).Operand as MemberExpression; memberName = memberExpression.Member.Name; var field = TypeCache.GetProperties(memberExpression.Expression.Type, true)[memberName]; memberName = __DBAdapter.FieldNameFormat(field); methodField = FormatFieldPrefix(memberExpression.Expression.Type, memberName); } else if (firstArgs is BinaryExpression) { var be = firstArgs as BinaryExpression; methodField = BinaryExpressionHandler(be.Left, be.Right, be.NodeType).Data.ToString(); } else if (firstArgs is MemberExpression) { //like a.Code memberExpression = firstArgs as MemberExpression; memberName = memberExpression.Member.Name; var type = memberExpression.Expression.Type; if (type.IsSubclassOf(typeof(IModel))) { var field = TypeCache.GetProperties(type, true)[memberExpression.Member.Name]; memberName = __DBAdapter.FieldNameFormat(field); } if (memberExpression.Expression.NodeType == ExpressionType.Parameter) { methodField = FormatFieldPrefix(memberExpression.Expression.Type, memberName); //var allConstant = true; for (int i = argsIndex; i < allArguments.Count; i++) { bool isConstant2; var obj = GetParameExpressionValue(allArguments[i], out isConstant2); arguments.Add(obj); } } else { //like Convert.ToDateTime(times) var obj = ConstantValueVisitor.GetParameExpressionValue(firstArgs); arguments.Add(obj); for (int i = argsIndex; i < allArguments.Count; i++) { bool isConstant2; var obj2 = GetParameExpressionValue(allArguments[i], out isConstant2); arguments.Add(obj2); } } } else if (firstArgs is ConstantExpression)//按常量 { //like DateTime.Parse("2016-02-11 12:56"), //isConstantMethod = true; var obj = ConstantValueVisitor.GetParameExpressionValue(firstArgs); arguments.Add(obj); } //else //{ // throw new CRLException("不支持此语法解析:" + args); //} if (nodeType == null) { nodeType = ExpressionType.Equal; } if (string.IsNullOrEmpty(methodField)) { //当是常量转换方法 var method = mcExp.Method; object obj; if (mcExp.Method.IsStatic)//like DateTime.Parse("2016-02-11") { obj = method.Invoke(null, arguments.ToArray()); } else//like time.AddDays(1) { if (arguments.Count == 0) { throw new Exception("未能解析" + exp); } var args1 = arguments.First(); arguments.RemoveAt(0); obj = method.Invoke(args1, arguments.ToArray()); } var exp2 = new CRLExpression.CRLExpression() { Type = CRLExpression.CRLExpressionType.Value, Data = obj }; //var cache = new MethodCallExpressionCacheItem() { CRLExpression = exp2, argsIndex = argsIndex, isConstantMethod = isConstantMethod, isStatic = mcExp.Method.IsStatic }; //MethodCallExpressionCache[key] = cache; return(exp2); } var methodInfo = new CRLExpression.MethodCallObj() { Args = arguments, ExpressionType = nodeType.Value, MemberName = memberName, MethodName = methodName, MemberQueryName = methodField }; methodInfo.ReturnType = mcExp.Type; #endregion var exp4 = new CRLExpression.CRLExpression() { Type = CRLExpression.CRLExpressionType.MethodCall, Data = methodInfo }; //if (SettingConfig.UseLambdaCache && false) //{ // var cache2 = new MethodCallExpressionCacheItem() { CRLExpression = exp4, argsIndex = argsIndex, isConstantMethod = isConstantMethod }; // MethodCallExpressionCache[key] = cache2; //} return(exp4); #endregion }