Beispiel #1
0
        /// <summary>
        /// 发布事件,使之能作用到目标事件
        /// </summary>
        /// <param name="eventBus">命令总线</param>
        /// <param name="context">事件上下文</param>
        /// <param name="e">事件</param>
        public static Task PublishEventAsync(this IEventBus eventBus, IEvent e, ICommandContext context)
        {
            if (e == null)
            {
                throw new ParameterNullException("e", "聚合根事件不能为空");
            }

            if (EmitBuilder.PreferredDynamic)
            {
                return(Task.FromResult(eventBus.Publish(context, (dynamic)e)));
            }

            var type   = e.GetType();
            var action = actionTable[type] as Func <IEventBus, IEvent, ICommandContext, Task>;

            if (action == null)
            {
                var emit = EasyEmitBuilder <Func <IEventBus, IEvent, ICommandContext, Task> > .NewDynamicMethod();

                emit.LoadArgument(0);
                emit.LoadArgument(1);
                emit.LoadArgument(2);
                emit.Call(typeof(AnonymousExtension).GetMethod("PublishEventBuilderInvokerAsync", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(type));
                emit.Return();
                actionTable[type] = action = emit.CreateDelegate();
            }

            return(action.Invoke(eventBus, e, context));
        }
Beispiel #2
0
        /// <summary>
        /// 发布消息
        /// </summary>
        /// <param name="publisher">发布者</param>
        /// <param name="context">消息上下文</param>
        /// <param name="message">消息内容</param>
        public static void PublishMessage(this IMessagePublisher publisher, IMessage message, IMessageContext context)
        {
            if (message == null)
            {
                throw new ParameterNullException("message", "消息内容不能为空");
            }

            if (EmitBuilder.PreferredDynamic)
            {
                publisher.Publish(context, (dynamic)message);
                return;
            }

            var type   = message.GetType();
            var action = actionTable[type] as Action <IMessagePublisher, IMessage, IMessageContext>;

            if (action == null)
            {
                var emit = EasyEmitBuilder <Action <IMessagePublisher, IMessage, IMessageContext> > .NewDynamicMethod();

                emit.LoadArgument(0);
                emit.LoadArgument(1);
                emit.LoadArgument(2);
                emit.Call(typeof(AnonymousExtension).GetMethod("PublishMessageBuilderInvoker", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(type));
                emit.Return();
                actionTable[type] = action = emit.CreateDelegate();
            }

            action.Invoke(publisher, message, context);
        }
Beispiel #3
0
        /// <summary>
        /// 发布事件
        /// </summary>
        /// <param name="publisher"></param>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public static Task PublishMessageAsync(this IMessagePublisher publisher, IMessage message, IMessageContext context)
        {
            if (message == null)
            {
                throw new ParameterNullException("message", "消息内容不能为空");
            }

            if (EmitBuilder.PreferredDynamic)
            {
                return(Task.FromResult(publisher.Publish(context, (dynamic)message)));
            }

            var type     = message.GetType();
            var function = asyncActionTable[type] as Func <IMessagePublisher, IMessage, IMessageContext, Task>;

            if (function == null)
            {
                var emit = EasyEmitBuilder <Func <IMessagePublisher, IMessage, IMessageContext, Task> > .NewDynamicMethod();

                emit.LoadArgument(0);
                emit.LoadArgument(1);
                emit.LoadArgument(2);
                emit.Call(typeof(AnonymousExtension).GetMethod("PublishMessageAsyncBuilderInvoker", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(type));
                emit.Return();
                asyncActionTable[type] = function = emit.CreateDelegate();
            }

            return(function.Invoke(publisher, message, context));
        }
Beispiel #4
0
        /// <summary>
        /// 发布命令
        /// </summary>
        /// <param name="commandBus">命令总线</param>
        /// <param name="command">命令</param>
        /// <param name="communication">上下文通讯</param>
        public static ICommandHandlerResult SendCommand(this ICommandBus commandBus, ICommand @command, HandlerCommunication communication)
        {
            if (@command == null)
            {
                throw new ParameterNullException("command", "聚合根命令不能为空");
            }

            if (EmitBuilder.PreferredDynamic)
            {
                return(commandBus.Send((dynamic)command, communication));
            }

            var type   = @command.GetType();
            var action = actionTable[type] as Func <ICommandBus, ICommand, HandlerCommunication, ICommandHandlerResult>;

            if (action == null)
            {
                var emit = EasyEmitBuilder <Func <ICommandBus, ICommand, HandlerCommunication, ICommandHandlerResult> > .NewDynamicMethod();

                emit.LoadArgument(0);
                emit.LoadArgument(1);
                emit.LoadArgument(2);
                emit.Call(typeof(AnonymousExtension).GetMethod("SendCommandBuilderInvoker", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(type));
                emit.Return();
                actionTable[type] = action = emit.CreateDelegate();
            }

            return(action.Invoke(commandBus, command, communication));
        }
Beispiel #5
0
        /// <summary>
        /// 对常见的值类型进行emit操作
        /// </summary>
        /// <param name="emit">emit操作</param>
        private static void BuildDefinedType(EasyEmitBuilder <Func <IDataRecord, T> > emit)
        {
            var type        = typeof(T);
            var dbnullLabel = emit.DefineLabel();
            var retLbl      = emit.DefineLabel();
            var locals      = new[]
            {
                emit.DeclareLocal(typeof(bool)),
                emit.DeclareLocal(type),
            };

            emit.LoadArgument(0);
            emit.LoadConstant(0);
            emit.Call(DataRecordBuilderHelper._mIsDBNull);
            emit.StoreLocal(locals[0]);
            emit.LoadLocal(locals[0]);
            emit.BranchIfTrue(dbnullLabel);

            emit.LoadArgument(0);
            emit.LoadConstant(0);
            emit.Call(DataRecordBuilderHelper.DefinedTypeDict[type]);
            emit.StoreLocal(locals[1]);
            emit.Branch(retLbl);

            emit.MarkLabel(dbnullLabel);
            emit.LoadLocalAddress(locals[1]);
            emit.InitializeObject(type);
            emit.LoadLocal(locals[1]);
            emit.StoreLocal(locals[1]);
            emit.Branch(retLbl);

            emit.MarkLabel(retLbl);
            emit.LoadLocal(locals[1]);
            emit.Return();
        }
Beispiel #6
0
        /// <summary>
        /// 实现属性set方法
        /// </summary>
        /// <param name="field">字段</param>
        /// <returns></returns>
        public static Action <object, object> BuildSetMethod(this FieldInfo field)
        {
            if (field == null)
            {
                return(null);
            }

            if (!field.IsInitOnly)
            {
                return(null);
            }

            var emit = EasyEmitBuilder <Action <object, object> > .NewDynamicMethod();

            /*静态方法可以不用加载this*/
            if (!field.IsStatic)
            {
                emit.LoadArgument(0);
            }

            emit.LoadArgument(1);
            if (field.FieldType.IsValueType)
            {
                emit.UnboxAny(field.FieldType);
            }
            else
            {
                emit.CastClass(field.FieldType);
            }
            emit.StoreField(field);
            emit.Return();
            return(emit.CreateDelegate());
        }
        /// <summary>
        /// 进行构建
        /// </summary>
        /// <param name="target">目标对象</param>
        /// <param name="setting">配置</param>
        /// <param name="interceptors">所实现的拦截器接口</param>
        /// <returns></returns>
        public Func <Target, IInterceptor[], Target> Build(Target target, InterceptCompileSetting setting, Type[] interceptors)
        {
            var build = this.BuildNotCepaType(target);

            if (build != null)
            {
                return(build);
            }

            var newType = default(Type);

            /*构建接口,较为容易*/
            if (this.TargetType.IsInterface)
            {
                newType = BuildInterface(this.TargetType, typeof(Target), interceptors, setting);
                var interfaceEmit = EasyEmitBuilder <Func <Target, IInterceptor[], Target> > .NewDynamicMethod();

                interfaceEmit.LoadArgument(0);
                interfaceEmit.LoadArgument(1);
                interfaceEmit.NewObject(newType.GetConstructor(new[] { typeof(Target), typeof(IInterceptor[]) }));
                interfaceEmit.Return();
                return(interfaceEmit.CreateDelegate());
            }

            newType = BuildClass(target.GetType(), interceptors, setting);
            var classEmit = EasyEmitBuilder <Func <Target, IInterceptor[], Target> > .NewDynamicMethod();

            //classEmit.LoadArgument(0);
            classEmit.LoadArgument(1);
            classEmit.NewObject(newType.GetConstructor(new[] { typeof(IInterceptor[]) }));
            classEmit.Return();

            return(classEmit.CreateDelegate());
        }
Beispiel #8
0
            /// <summary>
            /// 进行构建
            /// </summary>
            /// <returns></returns>
            public Action <ISerializerWriter, JsonSerializeSetting, TException, byte> Build(JsonSerializeSetting setting)
            {
                var emit = EasyEmitBuilder <Action <ISerializerWriter, JsonSerializeSetting, TException, byte> > .NewDynamicMethod();

                this.Build(emit, setting);
                emit.Return();
                return(emit.CreateDelegate());
            }
Beispiel #9
0
        /// <summary>
        /// 使用Type来构造<see cref="DbProviderFactory"/>
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        protected static DbProviderFactory CreateDbProviderFactory(Type type)
        {
            var emit = EasyEmitBuilder <Func <DbProviderFactory> > .NewDynamicMethod();

            emit.NewObject(type.GetConstructors(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)[0]);
            emit.Return();
            return(emit.CreateDelegate().Invoke());
        }
Beispiel #10
0
            /// <summary>
            /// 进行构建
            /// </summary>
            public Func <IDeserializerReader, JsonDeserializeSetting, int, TException> Build(JsonDeserializeSetting setting)
            {
                var emit = EasyEmitBuilder <Func <IDeserializerReader, JsonDeserializeSetting, int, TException> > .NewDynamicMethod();

                this.Build(emit);
                emit.Return();
                return(emit.CreateDelegate());
            }
Beispiel #11
0
        public void TestCtor()
        {
            var emit = EasyEmitBuilder <Func <MyCommand> > .NewDynamicMethod();

            emit.NewObject(typeof(MyCommandTwo), Type.EmptyTypes);
            emit.Return();

            var com = emit.CreateDelegate()();
        }
        /// <summary>
        /// 进行构建
        /// </summary>
        /// <param name="sourceType"></param>
        /// <returns></returns>
        public virtual Type BuildClass(Type sourceType)
        {
            /*检查支持类型*/
            this.SupportType(sourceType);

            /*是接口类型,则要在内存中生成一个类,用于实现该接口所有定义*/
            /*生命一个类对象构造*/
            var nextTypename = this.GetNextTypeName(sourceType);
            var typeBuilder  = EasyEmitBuilder <Type> .NewTypeBuilder(nextTypename.NameSplace, nextTypename.TypeName, TypeAttributes.Public, sourceType, Type.EmptyTypes);

            /*获取成员,接口全部都是方法,对象可能返回,属性,字段等成员,但我们主要是代理方法*/
            var members = this.GetMembers(sourceType);
            var exists  = new List <MemberInfo>(members.Length);

            foreach (var member in members)
            {
                if (exists.Contains(member))
                {
                    continue;
                }

                if (member.MemberType == MemberTypes.Field)
                {
                    this.BuildField(member, members, exists, typeBuilder, sourceType, false);
                    continue;
                }

                if (member.MemberType == MemberTypes.Property)
                {
                    this.BuildProperty(member, members, exists, typeBuilder, sourceType, false);
                    continue;
                }

                if (member.MemberType == MemberTypes.Event)
                {
                    this.BuildEvent(member, members, exists, typeBuilder, sourceType, false);
                    continue;
                }
            }

            foreach (var member in members)
            {
                if (exists.Contains(member))
                {
                    continue;
                }

                if (member.MemberType == MemberTypes.Method)
                {
                    this.BuildMethod(member, members, exists, typeBuilder, sourceType, false);
                    continue;
                }
            }

            return(EasyEmitBuilder <Type> .CreateTypeInfo(typeBuilder));
        }
        /// <summary>
        /// 进行构建
        /// </summary>
        /// <param name="interfaceType"></param>
        /// <returns></returns>
        public virtual Type BuildInterface(Type interfaceType)
        {
            /*检查支持类型*/
            this.SupportType(interfaceType);

            /*是接口类型,则要在内存中生成一个类,用于实现该接口所有定义*/
            /*生命一个类对象构造*/
            var nextTypename = this.GetNextTypeName(interfaceType);
            var typeBuilder  = EasyEmitBuilder <Type> .NewTypeBuilder(nextTypename.NameSplace, nextTypename.TypeName, typeof(object), new[] { interfaceType });

            /*构造函数*/
            var ctorBuilder = typeBuilder.DefineDefaultConstructor(MethodAttributes.Public);

            /*获取成员,接口全部都是方法*/
            var members = this.GetInterfaceMembers(interfaceType);
            var exists  = new List <MemberInfo>(members.Length);

            foreach (var member in members)
            {
                if (exists.Contains(member))
                {
                    continue;
                }

                if (member.MemberType == MemberTypes.Event)
                {
                    this.BuildEvent(member, members, exists, typeBuilder, interfaceType, true);
                    continue;
                }

                if (member.MemberType == MemberTypes.Property)
                {
                    this.BuildProperty(member, members, exists, typeBuilder, interfaceType, true);
                    continue;
                }
            }

            foreach (var member in members)
            {
                if (exists.Contains(member))
                {
                    continue;
                }

                if (member.MemberType == MemberTypes.Method)
                {
                    this.BuildMethod(member, members, exists, typeBuilder, interfaceType, true);
                    continue;
                }
            }

            return(EasyEmitBuilder <Type> .CreateTypeInfo(typeBuilder));
        }
        /// <summary>
        /// long
        /// </summary>
        private Func <T, string> BuildWithNumberForLong()
        {
            var emit = EasyEmitBuilder <Func <T, string> > .NewDynamicMethod();

            var local = emit.DeclareLocal(typeof(long));

            emit.LoadArgument(0);
            emit.Convert(typeof(long));
            emit.StoreLocal(local);
            emit.LoadLocalAddress(local);
            emit.CallVirtual(typeof(long).GetMethod("ToString", Type.EmptyTypes));
            emit.Return();
            return(emit.CreateDelegate());
        }
        /// <summary>
        /// 进行构建
        /// </summary>
        public Func <IDeserializerReader, JsonDeserializeSetting, int, T> Build(JsonDeserializeSetting setting)
        {
            var emit = EasyEmitBuilder <Func <IDeserializerReader, JsonDeserializeSetting, int, T> > .NewDynamicMethod();

            if (!IsComplexType(this.TargetType) || this.IsType(this.TargetType) || this.IsAssignableFrom(this.TargetType, typeof(Exception)))
            {
                this.BuildNotCepaType(emit, this.TargetType);
                emit.Return();
                return(emit.CreateDelegate());
            }

            this.Build(emit);

            emit.Return();
            return(emit.CreateDelegate());
        }
Beispiel #16
0
        /// <summary>
        /// 对枚举进行emit操作
        /// </summary>
        /// <param name="emit"></param>
        /// <param name="innerType">对象类型</param>
        private static void BuildNullableEnumType(EasyEmitBuilder <Func <IDataRecord, T> > emit, Type innerType)
        {
            var type           = typeof(T);
            var dbnullLabel    = emit.DefineLabel();
            var retLbl         = emit.DefineLabel();
            var underlyingType = Enum.GetUnderlyingType(innerType);
            var locals         = new[]
            {
                emit.DeclareLocal(typeof(bool)),
                emit.DeclareLocal(underlyingType),
                emit.DeclareLocal(type),
            };

            emit.LoadArgument(0);
            emit.LoadConstant(0);
            emit.Call(DataRecordBuilderHelper._mIsDBNull);
            emit.StoreLocal(locals[0]);
            emit.LoadLocal(locals[0]);
            emit.BranchIfTrue(dbnullLabel);

            emit.LoadArgument(0);
            emit.LoadConstant(0);
            emit.Call(DataRecordBuilderHelper.DefinedTypeDict[underlyingType]);
            emit.StoreLocal(locals[1]);
            emit.LoadLocal(locals[1]);
            emit.Call(typeof(DataRecordBuilderHelper).GetMethod("_EnumParse", BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(new[] { innerType, underlyingType }));

            //emit.Call(DataRecordBuilderHelper.DefinedTypeDict[typeof(long)]);
            //emit.StoreLocal(locals[1]);
            //emit.LoadLocal(locals[1]);
            //emit.Call(typeof(DataRecordBuilderHelper).GetMethod("_Int64EnumParse", BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(innerType));

            emit.NewObject(typeof(T).GetConstructor(new[] { innerType }));
            emit.StoreLocal(locals[2]);
            emit.Branch(retLbl);

            emit.MarkLabel(dbnullLabel);
            emit.LoadLocalAddress(locals[2]);
            emit.InitializeObject(type);
            emit.LoadLocal(locals[2]);
            emit.StoreLocal(locals[2]);
            emit.Branch(retLbl);

            emit.MarkLabel(retLbl);
            emit.LoadLocal(locals[2]);
            emit.Return();
        }
Beispiel #17
0
        /// <summary>
        /// 反序列化对象
        /// </summary>
        /// <param name="input">源字符串</param>
        /// <param name="targetType">目标类型</param>
        /// <returns></returns>
        public object DeserializeObject(string input, Type targetType)
        {
            if (string.IsNullOrEmpty(input))
            {
                return(null);
            }

#if NET35
            var action = typeAction[targetType] as Func <JavaScriptSerializer, string, object>;
            if (action == null)
            {
                var members = typeof(JavaScriptConverter).GetMembers(BindingFlags.Instance | BindingFlags.Public);
                foreach (var member in members)
                {
                    if (member.MemberType != MemberTypes.Method)
                    {
                        continue;
                    }

                    if (member.Name != "Deserialize")
                    {
                        continue;
                    }

                    var method = (MethodInfo)member;
                    if (!method.IsGenericMethod)
                    {
                        continue;
                    }

                    var emit = EasyEmitBuilder <Func <JavaScriptSerializer, string, object> > .NewDynamicMethod();

                    emit.LoadArgument(0);
                    emit.LoadArgument(1);
                    emit.Call(method.MakeGenericMethod(targetType));
                    emit.Return();
                    typeAction[targetType] = action = emit.CreateDelegate();

                    return(action.Invoke(this, input));
                }
            }

            return(action.Invoke(this, input));
#else
            return(ser.Deserialize(input, targetType));
#endif
        }
Beispiel #18
0
        /// <summary>
        /// 实现属性set方法
        /// </summary>
        /// <param name="prop">属性</param>
        /// <returns></returns>
        public static Action <object, object> BuildSetMethod(this PropertyInfo prop)
        {
            if (prop == null)
            {
                return(null);
            }

            if (!prop.CanWrite)
            {
                return(null);
            }

            var emit = EasyEmitBuilder <Action <object, object> > .NewDynamicMethod();

            var setMethod = prop.GetSetMethod(true);

            /*静态方法可以不用加载this*/
            if (!setMethod.IsStatic)
            {
                emit.LoadArgument(0);
            }

            emit.LoadArgument(1);

            if (prop.PropertyType.IsValueType)
            {
                emit.UnboxAny(prop.PropertyType);
            }
            else
            {
                emit.CastClass(prop.PropertyType);
            }

            if (setMethod.IsVirtual)
            {
                emit.CallVirtual(setMethod);
            }
            else
            {
                emit.Call(setMethod);
            }

            emit.Return();
            return(emit.CreateDelegate());
        }
        /// <summary>
        /// 进行构建
        /// </summary>
        public Action <ISerializerWriter, JsonSerializeSetting, T, byte> Build(JsonSerializeSetting setting)
        {
            var emit = EasyEmitBuilder <Action <ISerializerWriter, JsonSerializeSetting, T, byte> > .NewDynamicMethod();

            if (!IsComplexType(this.TargetType) || this.IsType(this.TargetType) || this.IsAssignableFrom(this.TargetType, typeof(Exception)))
            {
                this.BuildNotCepaType(emit, setting, this.TargetType);
                emit.Return();
                return(emit.CreateDelegate());
            }

            //this.WriteObjectFrontSigil(emit);
            this.Build(emit, setting);
            // this.WriteObjectLastSigil(emit);

            emit.Return();
            return(emit.CreateDelegate());
        }
Beispiel #20
0
        /// <summary>
        /// Build
        /// </summary>
        /// <returns></returns>
        public static Func <IDataRecord, T> Build()
        {
            if (Func != null)
            {
                return(Func);
            }

            var type = typeof(T);
            var emit = EasyEmitBuilder <Func <IDataRecord, T> > .NewDynamicMethod(string.Format("{0}", type.Name));

            /*normal*/
            if (DataRecordBuilderHelper.DefinedTypeDict.ContainsKey(type))
            {
                BuildDefinedType(emit);
                return(emit.CreateDelegate());
            }
            else if (type.IsEnum)
            {
                BuildEnumType(emit);
                return(emit.CreateDelegate());
            }

            /* nullable<T> */
            var nullableType = Nullable.GetUnderlyingType(type);

            if (nullableType != null)
            {
                var genericType = type.GetGenericArguments()[0];
                if (DataRecordBuilderHelper.DefinedTypeDict.ContainsKey(genericType))
                {
                    BuildNullableDefinedType(emit, genericType);
                    return(emit.CreateDelegate());
                }
                else if (genericType.IsEnum)
                {
                    BuildNullableEnumType(emit, genericType);
                    return(emit.CreateDelegate());
                }
            }

            BuildObject(emit);
            return(emit.CreateDelegate());
        }
Beispiel #21
0
            public Action <SqlTagFormat, ArrayLabel, TextLabel, object, int> Build()
            {
                if (Action != null)
                {
                    return(Action);
                }

                var emit = EasyEmitBuilder <Action <SqlTagFormat, ArrayLabel, TextLabel, object, int> > .NewDynamicMethod();

                var method = typeof(ArrayLabel).GetMethod("LoadUsingDelegated").MakeGenericMethod(typeof(T));

                emit.LoadArgument(0);
                emit.LoadArgument(1);
                emit.LoadArgument(2);
                emit.LoadArgument(3);
                emit.LoadArgument(4);
                emit.Call(method);
                emit.Return();
                Action = emit.CreateDelegate();
                return(Action);
            }
Beispiel #22
0
            static MyObject()
            {
                var type = typeof(T);
                var emit = EasyEmitBuilder <Func <T> > .NewDynamicMethod();

                var local = emit.DeclareLocal(type);

                if (type.IsValueType)
                {
                    emit.LoadLocalAddress(local);
                    emit.InitializeObject(type);
                    emit.LoadLocal(local);
                    emit.Return();
                    Go = emit.CreateDelegate();
                    return;
                }

                var ctors = typeof(T).GetConstructors(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);

                foreach (var ctor in ctors)
                {
                    if (ctor.GetParameters().Length == 0)
                    {
                        emit.NewObject(ctor);
                        emit.StoreLocal(local);
                        emit.LoadLocal(local);
                        emit.Return();
                        Go = emit.CreateDelegate();
                        return;
                    }
                }

                emit.LoadConstant(type);
                emit.Call(typeof(Activator).GetMethod("CreateInstance", new[] { typeof(Type) }));
                emit.StoreLocal(local);
                emit.LoadLocal(local);
                emit.Return();
                Go = emit.CreateDelegate();
                return;
            }
Beispiel #23
0
        /// <summary>
        /// 用历史事件来重新还原聚合根最新状态
        /// </summary>
        /// <param name="history">历史领域事件</param>
        public void ReplyEvent(IEnumerable <IEvent> history)
        {
            foreach (var e in history)
            {
                if (EmitBuilder.PreferredDynamic)
                {
                    this.ApplyReplyEvent((dynamic)e);
                }
                else
                {
                    var type   = e.GetType();
                    var action = this.eventAction[type] as Action <AggregateRoot, IEvent>;
                    if (action == null)
                    {
                        //使用Delegate.CreateDelegate方法
                        //eventAction[type] = action = (Action<AggregateRoot, IEvent>)Delegate.CreateDelegate(typeof(Action<AggregateRoot, IEvent>), typeof(AggregateRoot).GetMethod("ApplyReplyEvent", BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(type));

                        /*装一下逼*/
                        var emit = EasyEmitBuilder <Action <IAggregateRoot, IEvent> > .NewDynamicMethod();

                        //load(this)
                        emit.LoadArgument(0);
                        emit.LoadArgument(1);
                        emit.Call(typeof(AggregateRoot).GetMethod("ApplyReplyEvent", BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(type));
                        emit.Return();
                        this.eventAction[type] = action = emit.CreateDelegate();
                    }

                    if (action == null)
                    {
                        continue;
                    }

                    action.Invoke(this, e);
                }

                this.Version++;
            }
        }
Beispiel #24
0
            /// <summary>
            /// 构建异常模块
            /// </summary>
            /// <param name="emit">emit构建</param>
            /// <param name="setting">配置</param>
            /// <param name="instanceLocal">当前对象变量</param>
            /// <param name="sourceType">节点成员</param>
            /// <param name="member">成员</param>
            /// <param name="memberType">成员类型</param>
            /// <param name="attributes">特性</param>
            /// <returns></returns>
            protected override bool BuildForExceptionModule(EasyEmitBuilder <Action <ISerializerWriter, JsonSerializeSetting, TException, byte> > emit, JsonSerializeSetting setting, ILocal instanceLocal, Type sourceType, MemberInfo member, Type memberType, Attribute[] attributes)
            {
                if (member.Name != "InnerException" || !TypeHelper.IsAssignableFrom(memberType, typeof(Exception)))
                {
                    return(false);
                }

                var nullValue = emit.DefineLabel();
                var relLabel  = emit.DefineLabel();

                if (instanceLocal == null)
                {
                    if (sourceType.IsValueType)
                    {
                        emit.LoadArgumentAddress(2);
                    }
                    else
                    {
                        emit.LoadArgument(2);
                    }
                }
                else
                {
                    if (sourceType.IsValueType)
                    {
                        emit.LoadLocalAddress(instanceLocal);
                    }
                    else
                    {
                        emit.LoadLocal(instanceLocal);                             // @object
                    }
                }
                if (member.MemberType == MemberTypes.Property)             // @object.get_item()
                {
                    emit.Call(((PropertyInfo)member).GetGetMethod());
                }
                else
                {
                    emit.LoadField(((FieldInfo)member));
                }

                emit.LoadNull();
                emit.CompareGreaterThan();
                emit.BranchIfFalse(nullValue);

                this.WriteMemberName(emit, setting, member, attributes);
                this.WriteColon(emit, setting);
                this.WriteObjectFrontSigil(emit, setting);

                emit.LoadArgument(0);
                emit.LoadArgument(1);
                if (instanceLocal == null)
                {
                    if (sourceType.IsValueType)
                    {
                        emit.LoadArgumentAddress(2);
                    }
                    else
                    {
                        emit.LoadArgument(2);
                    }
                }
                else
                {
                    if (sourceType.IsValueType)
                    {
                        emit.LoadLocalAddress(instanceLocal);
                    }
                    else
                    {
                        emit.LoadLocal(instanceLocal);                             // @object
                    }
                }
                if (member.MemberType == MemberTypes.Property)             // @object.get_item()
                {
                    emit.Call(((PropertyInfo)member).GetGetMethod(true));
                }
                else
                {
                    emit.LoadField(((FieldInfo)member));
                }

                emit.Call(Serialize.SerialierBuilderHelper.GetExceptionParseMethod(memberType));
                this.WriteObjectLastSigil(emit, setting);
                emit.Branch(relLabel);

                emit.MarkLabel(nullValue);
                this.WriteMemberName(emit, setting, member, attributes);
                this.WriteColon(emit, setting);
                if (setting.WriteNullWhenObjectIsNull)
                {
                    this.WriteNull(emit, setting);
                }
                else
                {
                    this.WriteObjectSigil(emit, setting);
                }
                emit.Branch(relLabel);

                emit.MarkLabel(relLabel);
                emit.Nop();
                return(true);
            }
        /// <summary>
        /// ctor
        /// </summary>
        /// <param name="typeHandler"></param>
        public TypeHandlerAttribute(Type typeHandler)
        {
            if (!typeHandler.IsAssignableFromType(typeof(ITypeHandler)))
            {
                throw new ArgumentException("ITypeHandler is not AssignableFrom typehanlder");
            }

            this.TypeHandler = typeHandler;

            //toVlaue
            if (this.TypeHandler.IsAssignableFromType(typeof(IReadingFromDataRecordToValueTypeHandler <>)))
            {
                var types = this.TypeHandler.MatchTargetType(typeof(IReadingFromDataRecordToValueTypeHandler <>));
                if (types.IsNullOrEmpty())
                {
                    return;
                }

                foreach (var type in types)
                {
                    if (type.IsInterface && type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IReadingFromDataRecordToValueTypeHandler <>))
                    {
                        var genraiceArgs = type.GetGenericArguments();
                        if (genraiceArgs != null && genraiceArgs.Length > 0)
                        {
                            var emit = EasyEmitBuilder <Func <TypeHandlerAttribute, System.Data.IDataRecord, string, object> > .NewDynamicMethod();

                            emit.LoadArgument(0);
                            emit.LoadArgument(1);
                            emit.LoadArgument(2);
                            emit.Call(typeof(TypeHandlerAttribute).GetMethod("OnDataReadingUsingEmit", BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(genraiceArgs));
                            emit.Return();
                            toValue = emit.CreateDelegate();
                            break;
                        }
                    }
                }
            }

            //toParameter
            if (this.TypeHandler.IsAssignableFromType(typeof(ICastingValueToParameterTypeHandler <>)))
            {
                var types = this.TypeHandler.MatchTargetType(typeof(ICastingValueToParameterTypeHandler <>));
                if (types.IsNullOrEmpty())
                {
                    return;
                }

                foreach (var type in types)
                {
                    if (type.IsInterface && type.IsGenericType && type.GetGenericTypeDefinition() == typeof(ICastingValueToParameterTypeHandler <>))
                    {
                        var genraiceArgs = type.GetGenericArguments();
                        if (genraiceArgs != null && genraiceArgs.Length > 0)
                        {
                            var emit = EasyEmitBuilder <Func <TypeHandlerAttribute, object, object> > .NewDynamicMethod();

                            emit.LoadArgument(0);
                            emit.LoadArgument(1);
                            emit.Call(typeof(TypeHandlerAttribute).GetMethod("OnInitingParameterUsingEmit", BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(genraiceArgs));
                            emit.Return();
                            toParameter = emit.CreateDelegate();
                            break;
                        }
                    }
                }
            }
        }
Beispiel #26
0
        /// <summary>
        /// 快速实现方法
        /// </summary>
        /// <param name="method">方法</param>
        /// <returns></returns>
        public static Func <object, object[], object> GetMethodInvoker(this MethodInfo method)
        {
            var emit = EasyEmitBuilder <Func <object, object[], object> > .NewDynamicMethod();

            var parameters     = method.GetParameters();
            var parameterTypes = new List <Type>(parameters.Length);

            foreach (var parameter in parameters)
            {
                parameterTypes.Add(parameter.ParameterType.IsByRef ? parameter.ParameterType.GetElementType() : parameter.ParameterType);
            }

            var locals = new List <ILocal>(emit.ParameterTypes.Length);

            for (var i = 0; i < parameterTypes.Count; i++)
            {
                var local = emit.DeclareLocal(parameterTypes[i]);
                emit.LoadArgument(1);
                emit.LoadConstant(i);
                emit.LoadElementReference();
                if (parameterTypes[i].IsValueType)
                {
                    emit.UnboxAny(parameterTypes[i]);
                }
                else
                {
                    emit.CastClass(parameterTypes[i]);
                }

                emit.StoreLocal(local);
                locals.Add(local);
            }

            if (!method.IsStatic)
            {
                emit.LoadArgument(0);
            }

            for (var i = 0; i < parameterTypes.Count; i++)
            {
                if (parameterTypes[i].IsByRef)
                {
                    emit.LoadLocalAddress(locals[i]);
                }
                else
                {
                    emit.LoadLocal(locals[i]);
                }
            }

            if (method.IsVirtual)
            {
                emit.CallVirtual(method);
            }
            else
            {
                emit.Call(method);
            }

            if (method.ReturnType == typeof(void))
            {
                emit.LoadNull();
            }
            else if (method.ReturnType.IsValueType)
            {
                emit.Box(method.ReturnType);
            }

            emit.Return();
            return(emit.CreateDelegate());
        }
        /// <summary>
        /// ulong
        /// </summary>
        private Func <T, string> BuildForULong()
        {
            var emit = EasyEmitBuilder <Func <T, string> > .NewDynamicMethod();

            IDictionary <ulong, KeyValuePair <string, T> > enumValus = null;

            enumValus = EnumValues <T> .ToULongDictionary();

            if (enumValus.Count == 0)
            {
                emit.LoadConstant("");
                emit.Return();
                return(emit.CreateDelegate());
            }

            var type       = typeof(ulong);
            var donelbl    = emit.DefineLabel();
            var defaultLbl = emit.DefineLabel();

            var local       = emit.DeclareLocal(type);
            var stringLocal = emit.DeclareLocal(typeof(string));

            var writeLabels = new List <ILabel>(enumValus.Count);
            var jumpLabels  = new List <ILabel>(enumValus.Count);

            foreach (var i in enumValus)
            {
                writeLabels.Add(emit.DefineLabel());
                jumpLabels.Add(emit.DefineLabel());
            }

            emit.LoadArgument(0);
            emit.Convert(type);
            emit.StoreLocal(local);
            emit.Branch(jumpLabels[0]);
            var index = -1;

            foreach (var l in enumValus)
            {
                index++;
                emit.MarkLabel(jumpLabels[index]);
                emit.LoadConstant(l.Key);
                emit.LoadLocal(local);
                if (index == enumValus.Count - 1)
                {
                    emit.UnsignedBranchIfNotEqual(defaultLbl);
                    emit.Nop();
                }
                else
                {
                    emit.UnsignedBranchIfNotEqual(jumpLabels[index + 1]);
                    emit.Nop();
                }
                emit.Branch(writeLabels[index]);
                emit.Nop();
            }

            index = -1;
            foreach (var l in enumValus)
            {
                index++;
                emit.MarkLabel(writeLabels[index]);
                emit.LoadConstant(l.Value.Key);
                emit.StoreLocal(stringLocal);
                emit.Branch(donelbl);
            }

            /*default*/
            emit.MarkLabel(defaultLbl);
            emit.LoadLocalAddress(local);
            emit.CallVirtual(typeof(ulong).GetMethod("ToString", Type.EmptyTypes));
            emit.StoreLocal(stringLocal);
            emit.Branch(donelbl);

            /*done*/
            emit.MarkLabel(donelbl);
            emit.LoadLocal(stringLocal);
            emit.Return();
            return(emit.CreateDelegate());
        }
Beispiel #28
0
        /// <summary>
        /// 对对象进行emit操作
        /// </summary>
        /// <param name="emit">The emit.</param>
        public static void BuildObject(EasyEmitBuilder <Func <IDataRecord, T> > emit)
        {
            var type          = typeof(T);
            var targetMembers = GetMembers(type);

            /*实例*/
            var instanceLocal = emit.DeclareLocal(type);

            if (type.IsValueType)
            {
                if (targetMembers == null || targetMembers.Count == 0)
                {
                    emit.LoadLocalAddress(instanceLocal);
                    emit.InitializeObject(type);
                    emit.LoadLocal(instanceLocal);
                    emit.Return();
                    return;
                }

                emit.LoadLocalAddress(instanceLocal);
                emit.InitializeObject(type);
                emit.LoadLocal(instanceLocal);
                emit.StoreLocal(instanceLocal);
                goto _Read;
            }
            else
            {
                /*object*/
                var ctors = typeof(T).GetConstructors(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
                foreach (var ctor in ctors)
                {
                    if (ctor.GetParameters().Length == 0)
                    {
                        emit.NewObject(ctor);
                        emit.StoreLocal(instanceLocal);
                        if (targetMembers == null || targetMembers.Count == 0)
                        {
                            emit.LoadLocal(instanceLocal);
                            emit.Return();
                            return;
                        }

                        goto _Read;
                    }
                }

                throw new ArgumentException(string.Format("the type {0} can not find the no parameter of ctor method", typeof(T).FullName));
            }

_Read:
            {
                var locals = new[]
                {
                    emit.DeclareLocal(typeof(bool)),
                    emit.DeclareLocal(typeof(int)),
                };

                var retlbl = emit.DefineLabel();
                var labels = new List <ILabel>(targetMembers.Count);
                for (var i = 0; i < targetMembers.Count; i++)
                {
                    labels.Add(emit.DefineLabel());
                }

                for (var i = 0; i < targetMembers.Count; i++)
                {
                    var  member     = targetMembers[i];
                    Type memberType = member.MemberType == MemberTypes.Property ? ((PropertyInfo)member).PropertyType : ((FieldInfo)member).FieldType;

                    if (i > 0)
                    {
                        emit.MarkLabel(labels[i]);
                    }

                    var attribute = member.GetCustomAttribute <TypeHandlerAttribute>();
                    if (attribute != null && attribute.TypeHandler.IsAssignableFromType(typeof(IReadingFromDataRecordToValueTypeHandler <>)))
                    {
                        TypeHandlerAttributeStorager <T> .Storage(attribute, member.Name);

                        if (type.IsValueType)
                        {
                            emit.LoadLocalAddress(instanceLocal);
                        }
                        else
                        {
                            emit.LoadLocal(instanceLocal);
                        }

                        emit.LoadArgument(0);
                        emit.LoadConstant(member.Name);
                        if (member.MemberType == MemberTypes.Property)
                        {
                            emit.Call(typeof(DataRecordBuilderHelper).GetMethod("ReadingValueFromDataRecordTypeHandler").MakeGenericMethod(new[] { ((PropertyInfo)member).PropertyType, type }));
                            emit.Call(((PropertyInfo)member).GetSetMethod(true));
                        }
                        else
                        {
                            emit.Call(typeof(DataRecordBuilderHelper).GetMethod("ReadingValueFromDataRecordTypeHandler").MakeGenericMethod(new[] { ((FieldInfo)member).FieldType, type }));
                            emit.StoreField(((FieldInfo)member));
                        }

                        if (i < labels.Count - 1)
                        {
                            emit.Branch(labels[i + 1]);
                        }
                        else
                        {
                            emit.Branch(retlbl);
                        }
                        continue;
                    }

                    /*reader*/
                    emit.LoadArgument(0);
                    emit.LoadConstant(member.Name);
                    emit.Call(DataRecordBuilderHelper._mGetOrdinal);
                    emit.StoreLocal(locals[1]);
                    emit.LoadLocal(locals[1]);
                    emit.LoadConstant(0);
                    if (i < labels.Count - 1)
                    {
                        emit.BranchIfLess(labels[i + 1]);
                    }
                    else
                    {
                        emit.BranchIfLess(retlbl);
                    }

                    emit.LoadArgument(0);
                    emit.LoadLocal(locals[1]);
                    emit.Call(DataRecordBuilderHelper._mIsDBNull);
                    emit.StoreLocal(locals[0]);
                    emit.LoadLocal(locals[0]);
                    if (i < labels.Count - 1)
                    {
                        emit.BranchIfTrue(labels[i + 1]);
                    }
                    else
                    {
                        emit.BranchIfTrue(retlbl);
                    }

                    if (DataRecordBuilderHelper.DefinedTypeDict.ContainsKey(memberType))
                    {
                        if (type.IsValueType)
                        {
                            emit.LoadLocalAddress(instanceLocal);
                        }
                        else
                        {
                            emit.LoadLocal(instanceLocal);
                        }

                        emit.LoadArgument(0);
                        emit.LoadLocal(locals[1]);
                        emit.Call(DataRecordBuilderHelper.DefinedTypeDict[memberType]);
                        if (member.MemberType == MemberTypes.Property)
                        {
                            emit.Call(((PropertyInfo)member).GetSetMethod(true));
                        }
                        else
                        {
                            emit.StoreField(((FieldInfo)member));
                        }

                        if (i < labels.Count - 1)
                        {
                            emit.Branch(labels[i + 1]);
                        }
                        else
                        {
                            emit.Branch(retlbl);
                        }
                        continue;
                    }
                    else if (memberType.IsEnum)
                    {
                        if (type.IsValueType)
                        {
                            emit.LoadLocalAddress(instanceLocal);
                        }
                        else
                        {
                            emit.LoadLocal(instanceLocal);
                        }
                        emit.LoadArgument(0);
                        emit.LoadLocal(locals[1]);

                        var underlyingType = Enum.GetUnderlyingType(memberType);
                        emit.Call(DataRecordBuilderHelper.DefinedTypeDict[underlyingType]);
                        emit.Call(typeof(DataRecordBuilderHelper).GetMethod("_EnumParse", BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(new[] { memberType, underlyingType }));

                        //emit.Call(DataRecordBuilderHelper.DefinedTypeDict[typeof(long)]);
                        //emit.Call(typeof(DataRecordBuilderHelper).GetMethod("_EnumParse", BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(memberType));

                        if (member.MemberType == MemberTypes.Property)
                        {
                            emit.Call(((PropertyInfo)member).GetSetMethod(true));
                        }
                        else
                        {
                            emit.StoreField(((FieldInfo)member));
                        }
                        if (i < labels.Count - 1)
                        {
                            emit.Branch(labels[i + 1]);
                        }
                        else
                        {
                            emit.Branch(retlbl);
                        }

                        continue;
                    }
                    else if (Nullable.GetUnderlyingType(memberType) != null)
                    {
                        var nullable = Nullable.GetUnderlyingType(memberType);
                        if (nullable.IsEnum)
                        {
                            if (type.IsValueType)
                            {
                                emit.LoadLocalAddress(instanceLocal);
                            }
                            else
                            {
                                emit.LoadLocal(instanceLocal);
                            }
                            emit.LoadArgument(0);
                            emit.LoadLocal(locals[1]);

                            var underlyingType = Enum.GetUnderlyingType(nullable);
                            emit.Call(DataRecordBuilderHelper.DefinedTypeDict[underlyingType]);
                            emit.Call(typeof(DataRecordBuilderHelper).GetMethod("_EnumParse", BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(new[] { nullable, underlyingType }));

                            //emit.Call(DataRecordBuilderHelper.DefinedTypeDict[typeof(long)]);
                            //emit.Call(typeof(DataRecordBuilderHelper).GetMethod("_EnumParse", BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(nullable));
                            emit.NewObject(memberType, new[] { nullable });
                            if (member.MemberType == MemberTypes.Property)
                            {
                                emit.Call(((PropertyInfo)member).GetSetMethod(true));
                            }
                            else
                            {
                                emit.StoreField(((FieldInfo)member));
                            }
                            if (i < labels.Count - 1)
                            {
                                emit.Branch(labels[i + 1]);
                            }
                            else
                            {
                                emit.Branch(retlbl);
                            }
                            continue;
                        }

                        if (!DataRecordBuilderHelper.DefinedTypeDict.ContainsKey(nullable))
                        {
                            continue;
                        }

                        if (type.IsValueType)
                        {
                            emit.LoadLocalAddress(instanceLocal);
                        }
                        else
                        {
                            emit.LoadLocal(instanceLocal);
                        }
                        emit.LoadArgument(0);
                        emit.LoadLocal(locals[1]);
                        emit.Call(DataRecordBuilderHelper.DefinedTypeDict[nullable]);
                        emit.NewObject(memberType, new[] { nullable });
                        if (member.MemberType == MemberTypes.Property)
                        {
                            emit.Call(((PropertyInfo)member).GetSetMethod(true));
                        }
                        else
                        {
                            emit.StoreField(((FieldInfo)member));
                        }
                        if (i < labels.Count - 1)
                        {
                            emit.Branch(labels[i + 1]);
                        }
                        else
                        {
                            emit.Branch(retlbl);
                        }

                        continue;
                    }
                    else
                    {
                        emit.Nop();
                    }
                }

                emit.MarkLabel(retlbl);
                emit.LoadLocal(instanceLocal);
                emit.Return();
            };

            return;
        }
        private Func <string, T> BuildForULong()
        {
            var emit = EasyEmitBuilder <Func <string, T> > .NewDynamicMethod();

            var ulongValues = EnumValues <T> .ToULongDictionary();

            var enumValus = new Dictionary <string, ulong>(ulongValues.Count * 2);

            foreach (var x in ulongValues)
            {
                enumValus[x.Key.ToString()] = x.Key;
                enumValus[x.Value.Key]      = x.Key;
            }
            if (enumValus.Count == 0)
            {
                emit.LoadConstant(0UL);
                emit.Return();
                return(emit.CreateDelegate());
            }

            var writeLabels = new List <ILabel>(enumValus.Count);
            var jumpLabels  = new List <ILabel>(enumValus.Count);

            foreach (var i in enumValus)
            {
                writeLabels.Add(emit.DefineLabel());
                jumpLabels.Add(emit.DefineLabel());
            }

            var ulongLocal = emit.DeclareLocal(typeof(ulong));
            var equalLocal = emit.DeclareLocal(typeof(bool));
            var donelbl    = emit.DefineLabel();
            var defaultLbl = emit.DefineLabel();

            emit.Branch(jumpLabels[0]);
            var index = -1;

            foreach (var l in enumValus)
            {
                index++;
                emit.MarkLabel(jumpLabels[index]);
                emit.LoadConstant(l.Key);
                emit.LoadArgument(0);
                //emit.Call(typeof(String).GetMethod("op_Equality", new[] { typeof(string), typeof(string) }));
                emit.Call(typeof(DeseralizerBuilderHelper).GetMethod("StringEqualityOnDeseralizing", new[] { typeof(string), typeof(string) }));
                emit.StoreLocal(equalLocal);
                emit.LoadLocal(equalLocal);
                emit.BranchIfTrue(writeLabels[index]);
                if (index == enumValus.Count - 1)
                {
                    emit.Branch(defaultLbl);
                }
                else
                {
                    emit.Branch(jumpLabels[index + 1]);
                }
            }
            ;

            /*write lbl*/
            index = -1;
            foreach (var l in enumValus)
            {
                index++;
                emit.MarkLabel(writeLabels[index]);
                emit.LoadConstant(l.Value);
                // emit.LoadConstant(3L);
                emit.StoreLocal(ulongLocal);
                emit.Branch(donelbl);
            }
            ;

            /*default*/
            emit.MarkLabel(defaultLbl);
            emit.LoadArgument(0);
            emit.Call(typeof(DeseralizerBuilderHelper).GetMethod("UlongParseFromStringOnDeseralizing", new[] { typeof(string) }));
            emit.StoreLocal(ulongLocal);
            emit.Branch(donelbl);

            /*done*/
            emit.MarkLabel(donelbl);
            emit.LoadLocal(ulongLocal);
            emit.Call(typeof(DeseralizerBuilderHelper).GetMethod("UlongParseToEnumOnDeseralizing", new[] { typeof(long) }).MakeGenericMethod(new[] { typeof(T) }));
            emit.Return();
            //Console.WriteLine(emit.ToString());
            return(emit.CreateDelegate());
        }
Beispiel #30
0
 /// <summary>
 /// 构建异常模块
 /// </summary>
 /// <param name="emit">emit构建</param>
 /// <param name="setting">配置</param>
 /// <param name="sourceType">成员类型</param>
 /// <returns></returns>
 protected override bool BuildForExceptionModule(EasyEmitBuilder <Action <ISerializerWriter, JsonSerializeSetting, TException, byte> > emit, JsonSerializeSetting setting, Type sourceType)
 {
     return(base.BuildForExceptionModule(emit, setting, sourceType));
 }