using System;
using System.Reflection;
using Ant.Extensions;

namespace Ant.DbExpressions
{
    public class DbMemberExpression : DbExpression
    {
        MemberInfo _member;
        DbExpression _exp;
        public DbMemberExpression(MemberInfo member, DbExpression exp)
            : base(DbExpressionType.MemberAccess)
        {
            if (member.MemberType != MemberTypes.Property && member.MemberType != MemberTypes.Field)
                throw new ArgumentException();

            this._member = member;
            this._exp = exp;
        }

        public override Type Type
        {
            get
            {
                return this._member.GetPropertyOrFieldType();
            }
        }

        public MemberInfo Member
        {
            get { return this._member; }
        }

        /// <summary>
        /// 字段或属性的包含对象
        /// </summary>
        public DbExpression Expression
        {
            get { return this._exp; }
        }

        public override T Accept<T>(DbExpressionVisitor<T> visitor)
        {
            return visitor.Visit(this);
        }
    }
}