public CallSite(MySynchronizedTypeInfo owner, uint id, MethodInfo info, CallSiteFlags flags) { OwnerType = owner; Id = id; MethodInfo = info; CallSiteFlags = flags; }
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; }
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)); }