public ChannelProxyCacheItem(AssemblyBuilderFactory assemblyFactory)
        {
            var serviceContract = typeof(TChannel).GetCustomAttributes(typeof(ServiceContractAttribute), true).OfType <ServiceContractAttribute>().FirstOrDefault();

            if (serviceContract != null)
            {
                this.HasCallback  = serviceContract.CallbackContract != null;
                this.CallbackType = serviceContract.CallbackContract;
            }

            var members = new List <DynamicMember>();

            if (HasCallback)
            {
                foreach (var item in CallbackType.GetInterfaces().Union(new[] { CallbackType }))
                {
                    if (item.GetProperties().Any() ||
                        item.GetEvents().Any() ||
                        item.GetMethods().Where(p => p.ReturnType != typeof(void)).Any())
                    {
                        throw new InvalidOperationException("Only methods and only void retrun types are allowed for callback contracts.");
                    }

                    members.AddRange(item.GetMethods().Select(p => new DynamicVoid(p.Name, p.GetParameters().Select(x => x.ParameterType).ToArray())));
                }
            }

            var dtb = new DynamicTypeBuilder <TProxy>(members, assemblyFactory);

            dtb.AddConvention(new ProxyConvention <TChannel>());
            if (HasCallback)
            {
                dtb.AddInterceptor(new ImplementInterfaceInterceptor(this.CallbackType));
            }

            this.proxyType = dtb.GeneratedType;

            createProxyDelegate = Expression.Lambda <Func <TProxy> >(Expression.New(this.proxyType)).Compile();
        }
Exemple #2
0
 private ChannelProxyCache()
 {
     this.assemblyBuilderFactory = new ChannelProxyAssemblyBuilderFactory();
     this.itemsLocker            = new object();
     this.items = new Collection <object>();
 }