如何动态调用ChannelFactory <tchannel>?</tchannel>

时间:2012-01-02 11:46:50

标签: c# channelfactory

我必须致电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;

2 个答案:

答案 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
    { }
}

几点:

  • 使用Activator.CreateInstance创建类型槽反射
  • 您应该完全限定您的interfaceName以确保反射可以找到它
  • 使用ServiceContract
  • 装饰您的服务界面
  • 确保您的终端格式有效

答案 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...