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(); }
private ChannelProxyCache() { this.assemblyBuilderFactory = new ChannelProxyAssemblyBuilderFactory(); this.itemsLocker = new object(); this.items = new Collection <object>(); }