我必须致电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;
答案 0 :(得分:2)
在控制台应用程序中尝试以下代码:
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
{ }
}
几点:
答案 1 :(得分:2)
嗯,这里有2个问题,动态创建ChannelFactory并动态调用它,而Reflection就是两者的解决方案。
你的代码和Wouter的代码都擅长通过Reflection动态创建ChannelFactory对象,问题是由于类型在编译时是未知的,你无法转换为它,你可以得到的只是非泛型(非常有用)ChannelFactory。
因此,要创建具体的Channel然后在其上调用方法,您可以自己再次使用Reflection ...或者让运行时本身通过动态代表您使用Reflection。也就是说,将您的最后一行(或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...