关于c#:动态创建模板的通用类型

关于c#:动态创建模板的通用类型

Dynamically Create a generic type for template

我正在使用ChannelFactory对WCF进行编程,该类需要一种类型才能调用CreateChannel方法。 例如:

1
IProxy proxy = ChannelFactory<IProxy>.CreateChannel(...);

就我而言,我正在做路由,所以我不知道我的通道工厂将使用哪种类型。 我可以解析消息标头以确定类型,但是我在那里碰到一堵砖墙,因为即使我有Type的实例,也无法在ChannelFactory期望泛型的地方传递它。

用非常简单的术语来重述此问题的另一种方式是,我正在尝试执行以下操作:

1
2
3
4
string listtype = Console.ReadLine(); // say"System.Int32"
Type t = Type.GetType( listtype);
List< T > myIntegers = new List<>(); // does not compile, expects a"type"
List<typeof(t)> myIntegers = new List<typeof(t)>(); // interesting - type must resolve at compile time?

我可以在C#中利用这种方法吗?


您正在寻找的是MakeGenericType

1
2
3
4
5
6
7
string elementTypeName = Console.ReadLine();
Type elementType = Type.GetType(elementTypeName);
Type[] types = new Type[] { elementType };

Type listType = typeof(List<>);
Type genericType = listType.MakeGenericType(types);
IProxy  proxy = (IProxy)Activator.CreateInstance(genericType);

因此,您要做的就是获取通用"模板"类的类型定义,然后使用运行时驱动类型来构建类型的特殊化。


您应该看一下Ayende的这篇文章:WCF,Mocking和IoC:天哪!底部附近的某个位置叫GetCreationDelegate的方法应该会有所帮助。它基本上是这样做的:

1
2
3
4
5
6
7
8
9
10
string typeName = ...;
Type proxyType = Type.GetType(typeName);

Type type = typeof (ChannelFactory<>).MakeGenericType(proxyType);

object target = Activator.CreateInstance(type);

MethodInfo methodInfo = type.GetMethod("CreateChannel", new Type[] {});

return methodInfo.Invoke(target, new object[0]);


这是一个问题:在您的特定情况下,您是否真的需要创建具有确切合同类型的渠道?

由于您要进行布线,因此很有可能仅处理通用通道形状。例如,如果您要路由单向消息,则可以创建一个通道来发送消息,如下所示:

1
2
3
4
ChannelFactory<IOutputChannel> factory = new ChannelFactory<IOutputChannel>(binding, endpoint);
IOutputChannel channel = factory.CreateChannel();
...
channel.SendMessage(myRawMessage);

如果您需要发送到双向服务,只需使用IRequestChannel即可。

如果您要进行路由,则通常来说,处理通用的通道形状(与通用的通用服务合同到??外部)要容易得多,只需确保您发送的消息正确无误即可。标头和属性。


推荐阅读

    编程解析linux命令?

    编程解析linux命令?,系统,标准,基础,设备,发行,电脑,工具,密码,名字,适当,如

    查看linux类型命令?

    查看linux类型命令?,系统,信息,命令,状态,数据,数字,情况,地址,类型,文件,lin

    linux删除类型命令?

    linux删除类型命令?,系统,档案,命令,文件,名称,环境,数据,不了,目录,文件夹,

    linux命令行图形编程?

    linux命令行图形编程?,系统,不了,情况,密码,工具,地方,百度,管理,图形界面,

    linux编程执行命令?

    linux编程执行命令?,电脑,系统,环境,命令,基础,发行,工具,代码,地址,名称,lin

    查看linux库类型命令?

    查看linux库类型命令?,系统,工作,信息,状态,电脑,命令,工具,代码,地址,发行,

    linux访问模板命令?

    linux访问模板命令?,工作,地址,系统,信息,管理,命令,目录,发行,设备,文件,lin

    linux终端命令行编程?

    linux终端命令行编程?,系统,工作,命令,终端,概念,时间,第一,代码,发行,地方,L

    linux网卡类型命令?

    linux网卡类型命令?,网络,系统,地址,信息,设备,状态,服务,名称,名字,网卡,如

    linux编程调用命令?

    linux编程调用命令?,系统,标准,管理,工作,基础知识,情况,环境,设备,基础,首

    linux编程所需的命令?

    linux编程所需的命令?,工作,地址,档案,系统,命令,管理,标准,信息,目录,文件,L

    linux命令行编程乱码?

    linux命令行编程乱码?,环境,统一,乱码,中文,状态,软件,数据,系统,字符集,文

    linux查看命令类型用?

    linux查看命令类型用?,信息,系统,情况,命令,实时,工作,设备,电脑,文件,类型,

    linux命令三种类型?

    linux命令三种类型?,工作,地址,系统,标准,时间,管理,命令,目录,信息,文件,lin

    linux命令解析模板化?

    linux命令解析模板化?,系统,工作,地址,命令,位置,目录,管理,最新,数据,通讯

    linux命令检索模板?

    linux命令检索模板?,时间,档案,系统,命令,名称,灵活,工具,文件,工作,环境,Lin

    linux编程c命令符?

    linux编程c命令符?,工具,代码,系统,保险,环境,文件,程序,命令,终端,编辑,到底

    linux常用编程命令?

    linux常用编程命令?,基础,基础知识,系统,管理,概念,在线,发展,设备,设计,名

    linux命令行界面编程?

    linux命令行界面编程?,系统,环境,代码,密码,命令,终端,首页,软件,工作,电脑,l

    linux命令行编程参数?

    linux命令行编程参数?,网络,信息,系统,实时,状态,情况,工具,服务,环境,分析,L