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); }
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); }