我正在尝试动态创建ChannelFactory:
var serviceType = GetServiceProxy();
var interfaceType = serviceType.GetServiceInterface(); //return IServiceInterface
var service = new ChannelFactory(binding, address);
问题是,正如您所看到的,在第二行,我没有泛型类型,不幸的是,ChannelFactory没有接受Type的重载。
任何方式吗??
答案 0 :(得分:3)
发现我只能用反射做到这一点。当然,您还必须使用反射调用方法。
创建“ChannelFactory”并调用“CreateChannel”方法:
private ChannelFactory CreateChannelFactory()
{
var channelFactoryType = typeof (ChannelFactory);
channelFactoryType = channelFactoryType.MakeGenericType(serviceType);
return (ChannelFactory)Activator.CreateInstance(channelFactoryType, binding, address);
}
private object CreateChannel()
{
var createchannel = channelFactory.GetType().GetMethod("CreateChannel", new Type[0]);
return createchannel.Invoke(channelFactory, null);
}
现在创建了频道,但由于只有接口类型可用,我只能调用方法:
var serviceType = service.GetType();
var remoteMethod = service.GetMethod(invocation.Method.Name);
remoteMethod.Invoke(service, invocation.Arguments);
答案 1 :(得分:0)
Hadi :这是forum post here(请查看Roman Kiss的答案,提供自定义 ChannelFactory2
类)解决您的问题寻找??
如果是这样,你可以停止阅读我的回复: - )
嗯,通常你会这样做:
1)有你的服务接口(IMyServiceInterface)
2)创建/检索您的绑定和端点信息
3)为该界面创建一个频道工厂:
ChannelFactory<IMyServiceInterface> myChannelFactory =
new ChannelFactory<IMyServiceInterface>(myBinding, myEndpoint);
4)从该渠道工厂,创建您的客户端代理:
IMyServiceInterface client = myChannelFactory.CreateChannel();
5)在该客户端上调用方法:
client.DoStuff();
那么你想要制作更通用/更动态的部分,为什么?这个想法背后的动力/驱动力是什么?
马克