我必须调用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;发布于 2012-01-02 20:20:21
在控制台App中尝试以下代码:
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
{ }
}以下是几点:
修饰您的服务接口确保您的端点采用有效的格式
发布于 2013-05-31 01:45:04
好吧,这里有两个问题,动态创建ChannelFactory和动态调用它,反射是这两个问题的解决方案。
您的代码和Wouter的代码都擅长通过反射动态创建ChannelFactory对象,问题是因为类型在编译时是未知的,所以不能强制转换为它,并且只能得到非泛型(无用的) ChannelFactory。
因此,要创建具体的Channel,然后调用其上的方法,您可以继续使用反射……或者让运行时本身通过动态的方式来代表您使用反射。也就是说,将您的最后一行(或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...https://stackoverflow.com/questions/8700420
复制相似问题