コード例 #1
0
        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);
        }