/// <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); } }
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; } }
/// <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); } }
/// <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; }
/// <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; }
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)); } }
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; } }
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; } }