private void GenerateCctor() { var allEvents = AllEvents .Where(x => x.GetCustomAttribute <InvokeAttribute>() != null && x.GetCustomAttribute <InvokeAttribute>().DispatchingStrategy == Dispatch.SerializePerType) .ToList(); if (allEvents.Count == 0) { return; } _perTypeScheduler = _typeBuilder.DefineField( "PerTypeScheduler", typeof(SerialTaskScheduler), FieldAttributes.Private | FieldAttributes.InitOnly | FieldAttributes.Static); var cctor = _typeBuilder.DefineTypeInitializer(); var gen = cctor.GetILGenerator(); gen.Emit(OpCodes.Ldstr, InterfaceType.FullName); gen.Emit(OpCodes.Ldnull); var loc = gen.DeclareLocal(typeof(ulong?)); gen.Emit(OpCodes.Ldloca, loc); gen.Emit(OpCodes.Initobj, typeof(ulong?)); gen.Emit(OpCodes.Ldloc, loc); gen.Emit(OpCodes.Ldc_I4_0); gen.Emit(OpCodes.Newobj, Methods.SerialTaskSchedulerCtor); gen.Emit(OpCodes.Stsfld, _perTypeScheduler); gen.Emit(OpCodes.Ret); }
public Task <IEnumerable <IEntityEvent <Guid> > > GetEvents(DateTime start, DateTime end) { var events = AllEvents.Where(e => e.Timestamp >= start && e.Timestamp <= end); return(Task.FromResult(events)); }
private void GenerateCtor() { var builder = _typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new[] { typeof(ulong), typeof(IRemotingEndPoint), typeof(IEndPointChannel), typeof(ISerializer) }); var gen = builder.GetILGenerator(); gen.Emit(OpCodes.Ldarg_0); gen.Emit(OpCodes.Call, Methods.ObjectCtor); gen.Emit(OpCodes.Ldarg_0); gen.Emit(OpCodes.Ldarg_1); gen.Emit(OpCodes.Stfld, ObjectId); gen.Emit(OpCodes.Ldarg_0); gen.Emit(OpCodes.Ldarg_2); gen.Emit(OpCodes.Stfld, EndPoint); gen.Emit(OpCodes.Ldarg_0); gen.Emit(OpCodes.Ldarg_3); gen.Emit(OpCodes.Stfld, Channel); gen.Emit(OpCodes.Ldarg_0); gen.Emit(OpCodes.Ldarg, 4); gen.Emit(OpCodes.Stfld, Serializer); var perObjectEvents = AllEvents .Where(x => x.GetCustomAttribute <InvokeAttribute>() != null && x.GetCustomAttribute <InvokeAttribute>().DispatchingStrategy == Dispatch.SerializePerObject) .ToList(); if (perObjectEvents.Count > 0) { _perObjectScheduler = _typeBuilder.DefineField("_perObjectScheduler", typeof(SerialTaskScheduler), FieldAttributes.Private | FieldAttributes.InitOnly); gen.Emit(OpCodes.Ldarg_0); gen.Emit(OpCodes.Ldstr, InterfaceType.FullName); gen.Emit(OpCodes.Ldnull); gen.Emit(OpCodes.Ldarg_1); gen.Emit(OpCodes.Newobj, Methods.NullableUInt64Ctor); gen.Emit(OpCodes.Ldc_I4_0); gen.Emit(OpCodes.Newobj, Methods.SerialTaskSchedulerCtor); gen.Emit(OpCodes.Stfld, _perObjectScheduler); } var perMethodEvents = AllEvents .Where(x => x.GetCustomAttribute <InvokeAttribute>() != null && x.GetCustomAttribute <InvokeAttribute>().DispatchingStrategy == Dispatch.SerializePerMethod) .ToList(); foreach (var eventInfo in perMethodEvents) { var scheduler = _typeBuilder.DefineField(string.Format("_{0}", eventInfo.Name), typeof(SerialTaskScheduler), FieldAttributes.Private | FieldAttributes.InitOnly); gen.Emit(OpCodes.Ldarg_0); gen.Emit(OpCodes.Ldstr, InterfaceType.FullName); gen.Emit(OpCodes.Ldstr, eventInfo.Name); gen.Emit(OpCodes.Ldarg_1); gen.Emit(OpCodes.Newobj, Methods.NullableUInt64Ctor); gen.Emit(OpCodes.Ldc_I4_0); gen.Emit(OpCodes.Newobj, Methods.SerialTaskSchedulerCtor); gen.Emit(OpCodes.Stfld, scheduler); _perEventSchedulers.Add(eventInfo, scheduler); } gen.Emit(OpCodes.Ret); }
void Init() { (m_Fields = new List <FieldInfo>(AllFields.Where(_ => Check(_)))).SortField(); (m_Events = new List <EventInfo>(AllEvents.Where(_ => Check(_)))).SortEvent(); (m_Propertys = new List <PropertyInfo>(AllPropertys.Where(_ => Check(_)))).SortProperty(); m_Methods.Clear(); foreach (var method in AllMethods) { if (!Check(method)) { continue; } var valid = true; var methodHandle = method.MethodHandle; //判断函数是不是 event add remove 函数 foreach (var eventInfo in AllEvents) { if (eventInfo.GetAddMethod().MethodHandle == methodHandle || eventInfo.GetRemoveMethod().MethodHandle == methodHandle) { if (!Check(eventInfo)) { valid = false; } break; } } if (valid) { //判断函数是不是 get set 函数 foreach (var propertyInfo in AllPropertys) { //如果是struct 并且是 set 属性则屏蔽,强转结构体的set会报错 if (IsStruct && propertyInfo.GetSetMethod()?.MethodHandle == methodHandle) { valid = false; break; } else if (propertyInfo.GetGetMethod()?.MethodHandle == methodHandle || propertyInfo.GetSetMethod()?.MethodHandle == methodHandle) { if (!Check(propertyInfo)) { valid = false; } break; } } } if (valid) { m_Methods.Add(method); } } m_Methods.SortMethod(); m_ExtensionMethods.Clear(); foreach (var extensionInfo in m_Extensions) { var nameSpace = extensionInfo.Namespace; var methods = extensionInfo.GetMethods(Script.BindingFlag); foreach (var methodInfo in methods) { //非扩展函数 if (!Util.IsExtensionMethod(methodInfo) || !Check(methodInfo)) { continue; } var paramterType = methodInfo.GetParameters()[0].ParameterType; //判断是模板函数 if (paramterType.IsGenericParameter && paramterType.BaseType != null && paramterType.BaseType.IsAssignableFrom(m_Type)) { m_ExtensionMethods.Add(methodInfo); } else if (ScorpioReflectUtil.CheckGenericMethod(methodInfo) && paramterType.IsAssignableFrom(m_Type)) { m_ExtensionMethods.Add(methodInfo); } else { continue; } if (!string.IsNullOrWhiteSpace(nameSpace)) { m_ExtensionUsing.Add(nameSpace); } } } m_ExtensionMethods.SortMethod(); m_Methods.ForEach(_ => m_MethodNames.Add(_.Name)); m_ExtensionMethods.ForEach(_ => m_MethodNames.Add(_.Name)); }