public static IndexerExpression AppendIndexer(this Expression expression, params int[] indices)
        {
            IndexerExpression indexerExpr = new IndexerExpression(Parenthesize(expression), new List <Expression>());

            foreach (int index in indices)
            {
                indexerExpr.Indexes.Add(new PrimitiveExpression(index));
            }
            DebugType staticType = expression.GetStaticType();

            if (staticType != null && staticType.IsArray)
            {
                indexerExpr.SetStaticType((DebugType)staticType.GetElementType());
            }
            if (staticType != null && staticType.FullNameWithoutGenericArguments == typeof(List <>).FullName)
            {
                indexerExpr.SetStaticType((DebugType)staticType.GetGenericArguments()[0]);
            }
            return(indexerExpr);
        }
示例#2
0
        public static Expression AppendMemberReference(this Expression expresion, IDebugMemberInfo memberInfo, params Expression[] args)
        {
            Expression target;

            if (memberInfo.IsStatic)
            {
                target = new TypeReferenceExpression()
                {
                    Type = memberInfo.DeclaringType.GetTypeReference()
                };
            }
            else
            {
                target = CastTo(expresion, (DebugType)memberInfo.DeclaringType);
            }

            if (memberInfo is DebugFieldInfo)
            {
                if (args.Length > 0)
                {
                    throw new DebuggerException("No arguments expected for a field");
                }

                var mre = new MemberReferenceExpression()
                {
                    Target = target.Clone(), MemberName = memberInfo.Name
                };
                return(mre.SetStaticType(memberInfo.MemberType));
            }

            if (memberInfo is MethodInfo)
            {
                var mre = new MemberReferenceExpression()
                {
                    Target = target, MemberName = memberInfo.Name
                };
                var ie = new InvocationExpression()
                {
                    Target = mre.Clone()
                };
                ie.Arguments.AddRange(AddExplicitTypes((MethodInfo)memberInfo, args));

                return(ie.SetStaticType(memberInfo.MemberType));
            }

            if (memberInfo is PropertyInfo)
            {
                PropertyInfo propInfo = (PropertyInfo)memberInfo;
                if (args.Length > 0)
                {
                    if (memberInfo.Name != "Item")
                    {
                        throw new DebuggerException("Arguments expected only for the Item property");
                    }
                    var ie = new IndexerExpression()
                    {
                        Target = target.Clone()
                    };
                    ie.Arguments.AddRange(AddExplicitTypes(propInfo.GetGetMethod() ?? propInfo.GetSetMethod(), args));

                    return(ie.SetStaticType(memberInfo.MemberType));
                }
                else
                {
                    return((new MemberReferenceExpression()
                    {
                        Target = target.Clone(),
                        MemberName = memberInfo.Name
                    }).SetStaticType(memberInfo.MemberType));
                }
            }

            throw new DebuggerException("Unknown member type " + memberInfo.GetType().FullName);
        }