private static void InitAccessLevel(DomainProperty property)
        {
            if (property.IsExtensions)
            {
                var method = ExtendedClassAttribute.GetPropertyMethod(property.OwnerType, property.Name);

                property.AccessLevelGet = GetAccessLevel(method.Get);
                property.AccessLevelSet = GetAccessLevel(method.Set);
            }
            else
            {
                var pi = property.PropertyInfo;

                if (property.IsDynamic)
                {
                    //动态属性的访问是公开的
                    property.AccessLevelGet = PropertyAccessLevel.Public;
                    property.AccessLevelSet = PropertyAccessLevel.Public;
                }
                else
                {
                    property.AccessLevelGet = GetAccessLevel(pi.GetMethod);
                    property.AccessLevelSet = GetAccessLevel(pi.SetMethod);
                }
            }
        }
        /// <summary>
        /// <para>初始化与领域对象相关的行为,由于许多行为是第一次使用对象的时候才触发,这样会导致没有使用对象却需要一些额外特性的时候缺少数据</para>
        /// <para>所以我们需要在使用领域驱动的之前执行初始化操作</para>
        /// </summary>
        internal static void Initialize()
        {
            if (_initialized)
            {
                return;
            }
            _initialized = true;

            //以下代码执行顺序不能变
            TypeIndex = GetTypeIndex();

            //指定动态类型的定义
            RemoteType.Initialize();

            //执行远程能力特性的初始化,收集相关数据
            RemotableAttribute.Initialize();


            //触发没有派生类的领域对象的静态构造
            foreach (var objectType in TypeIndex)
            {
                if (DerivedClassAttribute.IsDerived(objectType))
                {
                    continue;                                              //不执行派生类的
                }
                DomainObject.StaticConstructor(objectType);
            }

            //先执行派生类的
            DerivedClassAttribute.Initialize();

            //再执行扩展的
            ExtendedClassAttribute.Initialize();
        }
        //public static void CheckObjectExtension(Type type)
        //{
        //    if(!IsObjectExtension(type))
        //}

        /// <summary>
        /// 从扩展类上获取对象的属性方法定义,扩展类中表示属性的获取和设置用的方法是GetXXX,SetXXX,XXX是属性名称,这是我们的约定
        /// </summary>
        /// <param name="objectType"></param>
        /// <param name="propertyName"></param>
        /// <returns></returns>
        public static MethodTuple GetPropertyMethod(Type objectType, string propertyName)
        {
            var extensionTypes = ExtendedClassAttribute.GetExtensionTypes(objectType);

            foreach (var extensionType in extensionTypes)
            {
                //以下代码的意思是,
                var getMethod = extensionType.ResolveMethod(string.Format("Get{0}", propertyName));
                var setMethod = extensionType.ResolveMethod(string.Format("Set{0}", propertyName));
                if (getMethod == null && setMethod == null)
                {
                    continue;
                }
                return(new MethodTuple(getMethod, setMethod));
            }
            return(MethodTuple.Empty);
        }
        /// <summary>
        /// 获取领域属性定义的特性,这些特性可以标记在对象属性上,也可以标记在静态的领域属性字段上
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="objectType"></param>
        /// <param name="propertyName"></param>
        /// <returns></returns>
        internal static IEnumerable <T> GetAttributes <T>(Type objectType, string propertyName) where T : Attribute
        {
            List <T> result = new List <T>();

            //在对象属性定义上查找特性
            result.AddRange(GetAttributesFromObjectProperty <T>(objectType, propertyName));

            //从对象内部定义的领域属性上查找
            result.AddRange(GetAttributesFromDomainProperty <T>(objectType, propertyName));


            //从扩展对象的领域属性上查找
            var extensionTypes = ExtendedClassAttribute.GetExtensionTypes(objectType);

            foreach (var extensionType in extensionTypes)
            {
                result.AddRange(GetAttributesFromDomainProperty <T>(extensionType, propertyName));
            }

            return(result);
        }
 protected MethodInfo GetMethod()
 {
     return(ExtendedClassAttribute.IsObjectExtension(this.ObjectOrExtensionType) ? GetMethodFromObjectExtension() : GetMethodFromObject());
 }