我如何调用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;

我如何调用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...