首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何动态调用ChannelFactory<TChannel>?

如何动态调用ChannelFactory<TChannel>?
EN

Stack Overflow用户
提问于 2012-01-02 19:46:50
回答 2查看 3K关注 0票数 1

我必须调用ChannelFactory<TChannel>类。但是下面的代码是针对ChannelFactory类的。我不知道怎么给ChannelFactory<TChannel>打电话。请建议我如何调用ChannelFactory<TChannel>类。

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

发布于 2012-01-02 20:20:21

在控制台App中尝试以下代码:

代码语言:javascript
复制
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以确保反射可以找到它
  • 使用

修饰您的服务接口确保您的端点采用有效的格式

票数 2
EN

Stack Overflow用户

发布于 2013-05-31 01:45:04

好吧,这里有两个问题,动态创建ChannelFactory和动态调用它,反射是这两个问题的解决方案。

您的代码和Wouter的代码都擅长通过反射动态创建ChannelFactory对象,问题是因为类型在编译时是未知的,所以不能强制转换为它,并且只能得到非泛型(无用的) ChannelFactory。

因此,要创建具体的Channel,然后调用其上的方法,您可以继续使用反射……或者让运行时本身通过动态的方式来代表您使用反射。也就是说,将您的最后一行(或Wouter的最后一行)更改为:

代码语言:javascript
复制
dynamic factory = factoryCtr.Invoke(.....

代码语言:javascript
复制
dynamic factory = Activator.CreateInstance(...

不需要在末尾包括"as ChannelFactory“。

然后只需使用:

代码语言:javascript
复制
dynamic channel = factory.CreateChannel();
//and now invoke the methods in your Interface
channel.TestMethod...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8700420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档