SqlSugar.ResolveExpress.SetMemberValueToDynInv C# (CSharp) Method

SetMemberValueToDynInv() private static method

将解析值赋给dynInv
private static SetMemberValueToDynInv ( Expression &exp, MemberExpression me, object &dynInv ) : void
exp System.Linq.Expressions.Expression
me System.Linq.Expressions.MemberExpression
dynInv object
return void
        private static void SetMemberValueToDynInv(ref Expression exp, MemberExpression me, ref object dynInv)
        {
            var conExp = me.Expression as ConstantExpression;
            var fieldInfo = me.Member as System.Reflection.FieldInfo;
            if (conExp != null&&fieldInfo!=null)
            {
                dynInv = (fieldInfo).GetValue((me.Expression as ConstantExpression).Value);
                if (fieldInfo.FieldType.IsEnum)
                {
                    dynInv = Convert.ToInt32(Enum.ToObject(fieldInfo.FieldType, dynInv));
                }
            }
            else
            {

                var memberInfos = new Stack<MemberInfo>();

                // "descend" toward's the root object reference:
                while (exp is MemberExpression)
                {
                    var memberExpr = exp as MemberExpression;
                    memberInfos.Push(memberExpr.Member);
                    if (memberExpr.Expression == null)
                    {
                        if (memberExpr.Member.MemberType == MemberTypes.Property)
                        {
                            PropertyInfo pro = (PropertyInfo)memberExpr.Member;
                            dynInv = pro.GetValue(memberExpr.Member, null);
                            if (dynInv != null && dynInv.GetType().IsClass)
                            {
                                var fieldName = me.Member.Name;
                                var proInfo = dynInv.GetType().GetProperty(fieldName);
                                if (proInfo != null)
                                {
                                    dynInv = proInfo.GetValue(dynInv, null);
                                }
                                var fieInfo = dynInv.GetType().GetField(fieldName);
                                if (fieInfo != null)
                                {
                                    dynInv = fieInfo.GetValue(dynInv);
                                }
                                if (fieInfo == null && proInfo == null)
                                {
                                    throw new SqlSugarException(string.Format(ExpNoSupportObjectOrAttr, dynInv.GetType().FullName, dynInv.GetType().FullName));
                                }
                            }
                            return;
                        }
                        else if (memberExpr.Member.MemberType == MemberTypes.Field)
                        {
                            FieldInfo field = (FieldInfo)memberExpr.Member;
                            dynInv = field.GetValue(memberExpr.Member);
                            if (dynInv != null && dynInv.GetType().IsClass) {
                                var fieldName = me.Member.Name;
                                var proInfo = dynInv.GetType().GetProperty(fieldName);
                                if (proInfo != null) {
                                    dynInv=proInfo.GetValue(dynInv,null);
                                }
                                var fieInfo = dynInv.GetType().GetField(fieldName);
                                if (fieInfo != null) {
                                    dynInv = fieInfo.GetValue(dynInv);
                                }
                                if (fieInfo == null && proInfo == null)
                                {
                                    throw new SqlSugarException(string.Format(ExpNoSupportObjectOrAttr, dynInv.GetType().FullName, dynInv.GetType().FullName));
                                }
                            }
                            return;
                        }

                    }
                    if (memberExpr.Expression == null)
                    {
                        dynInv = ExpErrorUniqueKey;
                        return;
                    }
                    exp = memberExpr.Expression;
                }

                // fetch the root object reference:
                var constExpr = exp as ConstantExpression;
                if (constExpr == null) {
                    dynInv = ExpErrorUniqueKey;
                    return;
                }
                var objReference = constExpr.Value;

                // "ascend" back whence we came from and resolve object references along the way:
                while (memberInfos.Count > 0)  // or some other break condition
                {
                    var mi = memberInfos.Pop();
                    if (mi.MemberType == MemberTypes.Property)
                    {
                        var objProp= objReference.GetType().GetProperty(mi.Name);
                        if (objProp == null) {
                            dynInv = ExpErrorUniqueKey;
                            return;
                        }
                        objReference = objProp.GetValue(objReference, null);
                    }
                    else if (mi.MemberType == MemberTypes.Field)
                    {
                        var objField=objReference.GetType().GetField(mi.Name);
                        if (objField == null) {
                            dynInv = ExpErrorUniqueKey;
                            return;
                        }
                        objReference = objField.GetValue(objReference);
                    }
                }
                dynInv = objReference;
            }
        }