/// <summary>
        ///
        /// </summary>
        /// <param name="targetType"></param>
        /// <param name="accessorType"></param>
        /// <returns></returns>
        public static IClassAccessor GetClassAccessor(Type targetType, AccessorType accessorType)
        {
            ArgumentAssertion.IsNotNull(targetType, "targetType");

            IClassAccessor accessor = null;
            var            typeKey  = string.Format("{0}.{1}", accessorType, targetType.FullName);

            if (ClassAccessores.ContainsKey(typeKey))
            {
                accessor = ClassAccessores[typeKey];
            }
            else
            {
                lock (SyncObject)
                {
                    if (ClassAccessores.ContainsKey(typeKey))
                    {
                        accessor = ClassAccessores[typeKey];
                    }
                    else
                    {
                        accessor = ClassAccessorFactory.CreateClassAccessor(targetType, accessorType);
                        ClassAccessores.Add(typeKey, accessor);
                    }
                }
            }
            return(accessor);
        }
Example #2
0
        /// <summary>
        /// 获取指定类型的可以被持久化的属性列表
        /// </summary>
        /// <param name="type"></param>
        /// <param name="accessor"></param>
        /// <returns></returns>
        static IDictionary <string, Type> GetPersistProperties(this Type type, IClassAccessor accessor)
        {
            var targetProperties = accessor.PropertyAccessores;
            var propertyTypes    = new Dictionary <string, Type>(targetProperties.Count);

            foreach (var pair in targetProperties)
            {
                var prop     = pair.Value;
                var propName = prop.Name;
                var propType = prop.PropertyType;

                if (prop.CanRead && prop.CanWrite && prop.NonSerialized == false)
                {
                    propertyTypes.Add(propName, propType);
                }
            }

            return(propertyTypes);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="targetType"></param>
        /// <param name="accessorType"></param>
        /// <returns></returns>
        public static IClassAccessor CreateClassAccessor(Type targetType, AccessorType accessorType)
        {
            IClassAccessor accessor = null;

            switch (accessorType)
            {
            case AccessorType.Reflection:
            {
                accessor = new ReflectionClassAccessor(targetType);
                break;
            }

            default:
            {
                accessor = new EmitClassAccessor(targetType);
                break;
            }
            }

            return(accessor);
        }
Example #4
0
 public override void VisitClassAccessor <TAttributeGroup, TMethodBody>(IClassAccessor <TAttributeGroup, TMethodBody> accessor)
 {
     visitor.VisitAccessorWithReflection((AccessorWithReflection)(object)accessor);
 }