动态创建模板的泛型我在写WCF使用ChannelFactory,它需要一个类型来调用CreateChannel方法。例如:IProxyproxy=ChannelFactory.CreateChannel(...);在我的例子中,我正在做路由,所以我不知道我的频道工厂将使用什么类型。我可以解析消息头以确定类型,但我在那里碰壁了,因为即使我有TypeI的实例,我也无法传递ChannelFactory期望泛型的类型的实例。另一种用非常简单的方式重新表述问题的方法是,我正在尝试做这样的事情:stringlisttype=Console.ReadLine();//说“System.Int32”Typet=Type.GetType(listtype);列表myIntegers=newList();//不编译,需要一个“类型”ListmyIntegers=newList();//有趣-类型必须在编译时解析?我可以在C#中使用这种方法吗?您正在寻找的是MakeGenericTypestringelementTypeName=Console.ReadLine();输入elementType=Type.GetType(elementTypeName);Type[]types=newType[]{elementType};输入listType=typeof(List);输入genericType=listType.MakeGenericType(types);IProxy代理=(IProxy)Activator.CreateInstance(genericType);因此,您要做的是采用通用“模板”类的类型定义,然后使用运行时驱动类型构建该类型的特化。您应该看看Ayende的这篇文章:WCF、Mocking和IoC:天啊!.靠近底部的是一个名为GetCreationDelegate的方法,它应该有所帮助。它基本上是这样的:stringtypeName=...;输入proxyType=Type.GetType(typeName);类型type=typeof(ChannelFactory).MakeGenericType(proxyType);objecttarget=Activator.CreateInstance(类型);MethodInfomethodInfo=type.GetMethod("CreateChannel",newType[]{});返回methodInfo.Invoke(target,newobject[0]);这里有一个问题:你真的需要创建一个频道吗?由于您正在布线,因此您很可能只需要处理通用通道形状。例如,如果您正在路由单向消息,那么您可以创建一个通道来发送消息,如下所示:ChannelFactoryfactory=newChannelFactory(binding,endpoint);IOutputChannel通道=factory.CreateChannel();...channel.SendMessage(myRawMessage);如果您需要发送双向服务,请改用IRequestChannel。如果您正在进行路由,通常更容易处理通用通道形状(外部通用的完整服务合同)并确保您发送的消息具有完全正确的标头和属性。以上就是C#学习教程:Generics类型的动态模板创建的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
