public static MemberAccessExpressionBuilderBase MemberAccess(Type elementType, Type memberType, string memberName)
        {
            memberType = memberType ?? typeof(object);

            if (elementType.IsCompatibleWith(typeof(DataRow)))
            {
                return new DataRowFieldAccessExpressionBuilder(memberType, memberName);
            }

            if (elementType.IsCompatibleWith(typeof(ICustomTypeDescriptor)))
            {
                return new CustomTypeDescriptorPropertyAccessExpressionBuilder(elementType, memberType, memberName);
            }

            if (elementType.IsCompatibleWith(typeof(XmlNode)))
            {
                return new XmlNodeChildElementAccessExpressionBuilder(memberName);
            }

            if (elementType == typeof(object) || elementType.IsCompatibleWith(typeof(System.Dynamic.IDynamicMetaObjectProvider)))
            {
                return new DynamicPropertyAccessExpressionBuilder(elementType, memberName);
            }

            return new PropertyAccessExpressionBuilder(elementType, memberName);
        }
        private static MemberAccessExpressionBuilder MemberAccess(Type type, Type memberType, string memberName)
        {
//            memberType = memberType ?? typeof (object);

            if (type == typeof(object) || type.IsCompatibleWith(typeof(IDynamicMetaObjectProvider)))
            {
                return new DynamicPropertyAccessExpressionBuilder(type, memberName);
            }

            return new PropertyAccessExpressionBuilder(type, memberName);
        }
        /// <exception cref="ArgumentException"><paramref name="elementType"/> did not implement <see cref="ICustomTypeDescriptor"/>.</exception>
        public CustomTypeDescriptorPropertyAccessExpressionBuilder(Type elementType, Type memberType, string memberName)
            : base(elementType, memberName)
        {
            if (!elementType.IsCompatibleWith(typeof(ICustomTypeDescriptor)))
            {
                throw new ArgumentException(
                    string.Format(CultureInfo.CurrentCulture, "ElementType: {0} did not implement {1}", elementType, typeof(ICustomTypeDescriptor)),
                    "elementType");
            }

            this.propertyType = GetPropertyType(memberType);
        }