示例#1
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public GameEntityT CreateNewInstance <GameEntityT>() where GameEntityT : WorldEntity
        {
            if (m_ConstructorInstance != null)
            {
                object returnObject = m_ConstructorInstance.Invoke();

                GameEntityT creature = returnObject as GameEntityT;
                if (creature == null)
                {
                    LOGs.WriteLine(LogMessageType.MSG_ERROR, "GameEntity.CreateNewInstance(...) - creature == null error!");
                    return(null);
                }

                return(creature);
            }
            else
            {
                m_ConstructorInstance = DynamicCalls.GetInstanceCreator(GetType());
                if (m_ConstructorInstance == null)
                {
                    throw new Exception("GameEntity.CreateNewInstance(...) - m_ConstructorInstance == null error!");
                }

                GameEntityT creature = m_ConstructorInstance.Invoke() as GameEntityT;
                if (creature == null)
                {
                    LOGs.WriteLine(LogMessageType.MSG_ERROR, "GameEntity.CreateNewInstance(...) - creature == null error!");
                    return(null);
                }

                return(creature);
            }
        }
示例#2
0
        private SourceList <T> GetList <T>(DbCommand cmd, DbTrans dbTran)
            where T : Entity
        {
            try
            {
                using (ISourceReader reader = dbProvider.ExecuteReader(cmd, dbTran))
                {
                    SourceList <T>            list    = new SourceList <T>();
                    FastCreateInstanceHandler creator = DataUtils.GetFastInstanceCreator(typeof(T));

                    while (reader.Read())
                    {
                        T entity = (T)creator();
                        entity.SetAllValues(reader);
                        entity.Attach();
                        list.Add(entity);
                    }

                    reader.Close();

                    return(list);
                }
            }
            catch
            {
                throw;
            }
        }
示例#3
0
        /// <summary>Gets the instance creator delegate that can be use to create instances of the specified type.</summary>
        /// <param name="type">The type of the objects we want to create.</param>
        /// <returns>A delegate that can be used to create the objects.</returns>
        public static FastCreateInstanceHandler GetInstanceCreator(Type type)
        {
            lock (dictCreator)
            {
                if (dictCreator.ContainsKey(type))
                {
                    return((FastCreateInstanceHandler)dictCreator[type]);
                }

                // generates a dynamic method to generate a FastCreateInstanceHandler delegate
                DynamicMethod dynamicMethod = new DynamicMethod(string.Empty, type, new Type[0], typeof(DynamicCalls).Module);

                ILGenerator ilGenerator = dynamicMethod.GetILGenerator();

                // generates code to create a new object of the specified type using the default constructor
                ilGenerator.Emit(OpCodes.Newobj, type.GetConstructor(Type.EmptyTypes));

                // returns the value to the caller
                ilGenerator.Emit(OpCodes.Ret);

                // converts the DynamicMethod to a FastCreateInstanceHandler delegate to create the object
                FastCreateInstanceHandler creator = (FastCreateInstanceHandler)dynamicMethod.CreateDelegate(typeof(FastCreateInstanceHandler));

                dictCreator.Add(type, creator);

                return(creator);
            }
        }
示例#4
0
        /// <summary>
        /// 创建一个委托
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static FastCreateInstanceHandler GetFastInstanceCreator(Type type)
        {
            if (type.IsInterface)
            {
                throw new MySoftException("可实例化的对象类型不能是接口!");
            }
            FastCreateInstanceHandler creator = DynamicCalls.GetInstanceCreator(type);

            return(creator);
        }
 public DTOType(Type type, FastCreateInstanceHandler handler)
     : this()
 {
     // Type = type;
     Name             = type.Name;
     TypeGuid         = type.GUID;
     Handler          = handler;
     LastCallDateTime = DateTime.Now;
     CallCount        = 1;
 }
示例#6
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="type"></param>
        /// <param name="fProbability"></param>
        public Loot(Type type, float fProbability)
        {
            m_ConstructorInstance = DynamicCalls.GetInstanceCreator(type);
            if (m_ConstructorInstance == null)
            {
                throw new Exception("Loot.Loot(...) - m_ConstructorInstance == null error!");
            }

            m_fProbability = fProbability;
        }
示例#7
0
        public void GetInstanceCreatorTest()
        {
            Type type = null;                          // TODO: 初始化为适当的值
            FastCreateInstanceHandler expected = null; // TODO: 初始化为适当的值
            FastCreateInstanceHandler actual;

            actual = DynamicCalls.GetInstanceCreator(type);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("验证此测试方法的正确性。");
        }
 internal static void Add(Type type, FastCreateInstanceHandler handler)
 {
     if (type == null)
     {
         return;
     }
     lock (syncLocker)
     {
         Cache.Add(type.GUID, new DTOType(type, handler));
     }
 }
示例#9
0
        private SourceList <TResult> ExcuteDataList <TResult>(QuerySection <TResult> query, bool all)
            where TResult : Entity
        {
            try
            {
                string queryString = query.QueryString;
                if (this.unionQuery && all)
                {
                    queryString += OrderString;
                }

                string cacheKey = GetCacheKey(queryString, this.Parameters);
                object obj      = GetCache <TResult>("ListEntity", cacheKey);
                if (obj != null)
                {
                    return((SourceList <TResult>)obj);
                }

                using (SourceReader reader = ExcuteDataReader(query, all))
                {
                    SourceList <TResult> list = new SourceList <TResult>();

                    FastCreateInstanceHandler creator = DataUtils.GetFastInstanceCreator(typeof(TResult));

                    while (reader.Read())
                    {
                        TResult entity = (TResult)creator();
                        entity.SetAllValues(reader);
                        entity.Attach();
                        list.Add(entity);
                    }

                    SetCache <TResult>("ListEntity", cacheKey, list);

                    reader.Close();

                    return(list);
                }
            }
            catch
            {
                throw;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static FastCreateInstanceHandler GetInstanceCreator(Type type)
        {
            lock (dictCreator)
            {
                if (dictCreator.ContainsKey(type)) return (FastCreateInstanceHandler)dictCreator[type];
                DynamicMethod dynamicMethod = new DynamicMethod(string.Empty, type, new Type[0], typeof(DynamicCalls).Module);

                ILGenerator ilGenerator = dynamicMethod.GetILGenerator();
                ilGenerator.Emit(OpCodes.Newobj, type.GetConstructor(Type.EmptyTypes));

                ilGenerator.Emit(OpCodes.Ret);

                FastCreateInstanceHandler creator = (FastCreateInstanceHandler)dynamicMethod.CreateDelegate(typeof(FastCreateInstanceHandler));

                dictCreator.Add(type, creator);

                return creator;
            }
        }
示例#11
0
        private SourceList <TResult> ExecuteDataList <TResult>(QuerySection <TResult> query)
            where TResult : Entity
        {
            try
            {
                string queryString = query.QueryString;
                string cacheKey    = GetCacheKey(queryString, query.Parameters);
                object obj         = GetCache <TResult>("ListEntity", cacheKey);
                if (obj != null)
                {
                    return((SourceList <TResult>)obj);
                }

                using (SourceReader reader = ExecuteDataReader(queryString, query.Parameters))
                {
                    SourceList <TResult> list = new SourceList <TResult>();

                    FastCreateInstanceHandler creator = CoreHelper.GetFastInstanceCreator(typeof(TResult));

                    while (reader.Read())
                    {
                        TResult entity = (TResult)creator();
                        entity.SetDbValues(reader);
                        entity.Attach();
                        list.Add(entity);
                    }

                    SetCache <TResult>("ListEntity", cacheKey, list);

                    reader.Close();

                    return(list);
                }
            }
            catch
            {
                throw;
            }
        }