public static Expression AppendMemberReference(this Expression expresion, IDebugMemberInfo memberInfo, params Expression[] args) { Expression target; if (memberInfo.IsStatic) { target = new TypeReferenceExpression( memberInfo.DeclaringType.GetTypeReference() ); } else { target = expresion.CastTo((DebugType)memberInfo.DeclaringType); } if (memberInfo is DebugFieldInfo) { if (args.Length > 0) { throw new DebuggerException("No arguments expected for a field"); } return(new MemberReferenceExpression(target, memberInfo.Name).SetStaticType(memberInfo.MemberType)); } if (memberInfo is MethodInfo) { return(new InvocationExpression( new MemberReferenceExpression(target, memberInfo.Name), AddExplicitTypes((MethodInfo)memberInfo, args) ).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"); } return(new IndexerExpression( target, AddExplicitTypes(propInfo.GetGetMethod() ?? propInfo.GetSetMethod(), args) ).SetStaticType(memberInfo.MemberType)); } else { return(new MemberReferenceExpression(target, memberInfo.Name).SetStaticType(memberInfo.MemberType)); } } throw new DebuggerException("Unknown member type " + memberInfo.GetType().FullName); }