我如何调用channelfactory ?动态
本文关键字:channelfactory 动态 调用 何调用 | 更新日期: 2023-09-27 18:19:17
我必须调用ChannelFactory<TChannel>
类。但下面的代码是ChannelFactory
类。我不知道怎么打电话给ChannelFactory<TChannel>
。请建议我如何称呼ChannelFactory<TChannel>
班。
string interfaceName = "Test";
Type myInterfaceType = Type.GetType(interfaceName);
var factoryType = typeof(ChannelFactory<>).MakeGenericType(myInterfaceType);
var factoryCtr = factoryType.GetConstructor(new[] { typeof(BasicHttpBinding), typeof(EndpointAddress) });
ChannelFactory factorry = factoryCtr.Invoke(new object[] { new BasicHttpBinding(), new EndpointAddress(cmbpath.SelectedItem.ToString()) }) as ChannelFactory;
在控制台应用程序中尝试以下代码:
using System;
using System.ServiceModel;
namespace ExperimentConsoleApp
{
class Program
{
static void Main()
{
string endPoint = "http://localhost/service.svc";
string interfaceName = "ExperimentConsoleApp.ITest";
Type myInterfaceType = Type.GetType(interfaceName);
var factoryType = typeof(ChannelFactory<>).MakeGenericType(myInterfaceType);
ChannelFactory factory = Activator.CreateInstance(factoryType, new object[] { new BasicHttpBinding(), new EndpointAddress(endPoint) }) as ChannelFactory;
}
}
[ServiceContract]
public interface ITest
{ }
}
几点说明:
- 使用活化剂。通过反射创建类型
- 你应该完全限定你的interfaceName,以确保反射可以找到它
- 用ServiceContract 装饰你的服务接口
- 确保您的端点是有效的格式
这里有两个问题,动态创建ChannelFactory并动态调用它,而反射是这两个问题的解决方案。
你的代码和Wouter的代码都擅长通过反射动态创建ChannelFactory对象,问题是,由于在编译时类型未知,你不能强制转换到它,你所能得到的是非泛型(无用的)ChannelFactory。
所以,要创建你的具体通道,然后调用它的方法,你可以自己再一次使用反射。或者让运行时本身通过动态的方式代表你使用反射。也就是说,将您的最后一行(或Wouter的最后一行)更改为:
dynamic factory = factoryCtr.Invoke(.....
或
dynamic factory = Activator.CreateInstance(...
,不需要在末尾包含"as ChannelFactory"。
,然后直接使用:
dynamic channel = factory.CreateChannel();
//and now invoke the methods in your Interface
channel.TestMethod...