Esempio n. 1
0
 public CallSite(MySynchronizedTypeInfo owner, uint id, MethodInfo info, CallSiteFlags flags)
 {
     OwnerType     = owner;
     Id            = id;
     MethodInfo    = info;
     CallSiteFlags = flags;
 }
Esempio n. 2
0
 public CallSite(MySynchronizedTypeInfo owner, uint id, MethodInfo info, CallSiteFlags flags)
 {
     OwnerType = owner;
     Id = id;
     MethodInfo = info;
     CallSiteFlags = flags;
 }
Esempio n. 3
0
 public CallSite(MySynchronizedTypeInfo owner, uint id, MethodInfo info, CallSiteFlags flags, Action <T1, T2, T3, T4, T5, T6, T7> handler,
                 SerializeDelegate <T1, T2, T3, T4, T5, T6, T7> serializer, Func <T1, T2, T3, T4, T5, T6, T7, bool> validator)
     : base(owner, id, info, flags)
 {
     Handler    = handler;
     Serializer = serializer;
     Validator  = validator;
 }
Esempio n. 4
0
        CallSite CreateCallSite <T1, T2, T3, T4, T5, T6, T7>(MethodInfo info, uint id)
        {
            Type[] arguments = new Type[] { typeof(T1), typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7) };
            var    p         = arguments.Select(s => Expression.Parameter(s)).ToArray();

            Expression call;

            if (info.IsStatic)
            {
                call = Expression.Call(info, p.Skip(1).Where(s => s.Type != typeof(DBNull)).ToArray());
            }
            else
            {
                call = Expression.Call(p.First(), info, p.Skip(1).Where(s => s.Type != typeof(DBNull)).ToArray());
            }
            var handler = Expression.Lambda <Action <T1, T2, T3, T4, T5, T6, T7> >(call, p).Compile();

            var eventAttribute  = info.GetCustomAttribute <EventAttribute>();
            var serverAttribute = info.GetCustomAttribute <ServerAttribute>();

            CallSiteFlags flags = CallSiteFlags.None;

            if (serverAttribute != null)
            {
                flags |= CallSiteFlags.Server;
                if (serverAttribute.ExceptLocal)
                {
                    flags |= CallSiteFlags.ExceptLocal;
                }
            }
            if (info.HasAttribute <ClientAttribute>())
            {
                flags |= CallSiteFlags.Client;
            }
            if (info.HasAttribute <BroadcastAttribute>())
            {
                flags |= CallSiteFlags.Broadcast;
            }
            if (info.HasAttribute <BroadcastExceptAttribute>())
            {
                flags |= CallSiteFlags.BroadcastExcept;
            }
            if (info.HasAttribute <ReliableAttribute>())
            {
                flags |= CallSiteFlags.Reliable;
            }
            if (info.HasAttribute <RefreshReplicableAttribute>())
            {
                flags |= CallSiteFlags.RefreshReplicable;
            }
            if (info.HasAttribute <BlockingAttribute>())
            {
                flags |= CallSiteFlags.Blocking;
            }

            SerializeDelegate <T1, T2, T3, T4, T5, T6, T7> serializer = null;
            Func <T1, T2, T3, T4, T5, T6, T7, bool>        validator  = null;

            if (eventAttribute.Serialization != null)
            {
                var method = info.DeclaringType.GetMethod(eventAttribute.Serialization, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
                if (method == null)
                {
                    throw new InvalidOperationException(String.Format("Serialization method '{0}' for event '{1}' defined by type '{2}' not found", eventAttribute.Serialization, info.Name, info.DeclaringType.Name));
                }
                if (!method.GetParameters().Skip(1).All(s => s.ParameterType.IsByRef))
                {
                    throw new InvalidOperationException(String.Format("Serialization method '{0}' for event '{1}' defined by type '{2}' must have all arguments passed with 'ref' keyword (except BitStream)", eventAttribute.Serialization, info.Name, info.DeclaringType.Name));
                }
                var args = MethodInfoExtensions.ExtractParameterExpressionsFrom <SerializeDelegate <T1, T2, T3, T4, T5, T6, T7> >();
                var c    = Expression.Call(args.First(), method, args.Skip(1).Where(s => s.Type != typeof(DBNull)).ToArray());
                serializer = Expression.Lambda <SerializeDelegate <T1, T2, T3, T4, T5, T6, T7> >(c, args).Compile();
            }

            if (serverAttribute != null && serverAttribute.Validation != null)
            {
                var method = info.DeclaringType.GetMethod(serverAttribute.Validation, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
                if (method == null)
                {
                    throw new InvalidOperationException(String.Format("Validation method '{0}' for event '{1}' defined by type '{2}' not found", serverAttribute.Validation, info.Name, info.DeclaringType.Name));
                }
                var args = MethodInfoExtensions.ExtractParameterExpressionsFrom <Func <T1, T2, T3, T4, T5, T6, T7, bool> >();
                var c    = Expression.Call(args.First(), method, args.Skip(1).Where(s => s.Type != typeof(DBNull)).ToArray());
                validator = Expression.Lambda <Func <T1, T2, T3, T4, T5, T6, T7, bool> >(c, args).Compile();
            }

            serializer = serializer ?? CreateSerializer <T1, T2, T3, T4, T5, T6, T7>(info);
            validator  = validator ?? CreateValidator <T1, T2, T3, T4, T5, T6, T7>();

            return(new CallSite <T1, T2, T3, T4, T5, T6, T7>(Type, id, info, flags, handler, serializer, validator));
        }