当前位置: 首页 > 编程语言 > C#

如何将命名空间传递给方法?分享

时间:2023-04-10 10:52:15 C#

如何将命名空间传递给方法?namespaceMyOldService{publicMyNewService.AddressListToPrivateAddressList(){MyNewService.AddressListprivAddrList=newMyNewService.AddressList();privAddrList.creator=(MyNewService.AddressListCreator)this.creator;privAddrList.listId=this.listId;privAddrList.listIdSpecified=这个。listId指定;privAddrList.listName=this.listName;privAddrList.listType=(MyNewService.AddressingMode)this.listType;privAddrList.lastModified=this.lastModified;privAddrList.lastModifiedSpecified=this.lastModifiedFieldSpecified;if(this.siteList&this.listType==MyOldService.AddressingMode.XDAddressingModeSiteIDList){privAddrList.siteList=newlong[this.siteList.Length];Array.Copy(this.siteList,privAddrList.siteList,this.siteList.Length);}...最初写的目的是将SOAP命名空间MyOldService中定义的列表复制到新命名空间MyNewService中相同布局的类中。问题是,对于soap类,如果我将MyOldService命名空间导入第三个命名空间,比如MyOtherAppService,那么我的AddressList类将成为第三个命名空间的成员并被引用。因此,我不想复制代码,而是想用类似泛型的东西来装饰它(或以某种方式调整它)(我知道这是行不通的,因为我正在更改名称空间,而不仅仅是一种固定类型[我有多种类型需要从每个命名空间中获取,从代码片段中可以看出,以允许它将地址列表转换为它需要的任何命名空间中的相应类。可能吗?编辑:作为回应下面的一些评论,我会尝试定义我正在尝试做的更好的例子。三个类通过Web引用从WSDL导入(不,这些不会编译,只是用于说明的示例)。类AddressList都有相同的布局。命名空间A{枚举模式{};枚举创作者{};classATypeClass{}publicpartialclassAddressList{intid;枚举模式模式;enumCreatorcreatorlong[]siteList;ATypeClass[]cspList;}}命名空间B{枚举模式{};枚举创作者{};classBTypeClass{}publicpartialclassAddressList{intid;枚举模式模式;enumCreatorcreatorlong[]siteList;BTypeClass[]cspList;}}命名空间C{枚举模式{};枚举创作者{};classCTypeClass{}publicpartialclassAddressList{intid;字符串名称;枚举模式模式;enumCreatorcreatorlong[]siteList;CTypeClass[]cspList;}}我将使用新方法扩展名称空间A中的部分类:privAddrList.creator=(T.Creator)this.creator;privAddrList.id=this.id;privAddrList.name=this.name;privAddrList.mode=(T.Mode)this.mode;if(this.siteList!=null&&this.listType==Mode.XDAddressingModeSiteIDList){privAddrList.siteList=newlong[this.siteList.Length];Array.Copy(this.siteList,privAddrList.siteList,this.siteList.Length);}...}}}问题的一部分是来自不同命名空间的枚举,我设想这样调用它(虽然我知道我实际上不能这样做,但我正在寻找一个大致一样优雅的解决方案):B.AddressListal1=A.AddressList.ToPrivateAddressList();C.AddressListal1=A.AddressList.ToPrivateAddressList();我认为您正在寻找的是泛型类型定义中的接口和where关键字。从你的代码中我看到你有这个:你可以让每个类实现一个包含公共属性的接口而不是依赖相同的名称(你可以使用反射来达到预期的效果)。这样你就可以保持编译时类型安全:publicinterfaceICommonAddress{intid{get;放;}模式模式{得到;放;}造物主造物主{get;放;}long[]siteList{得到;放;}ICommonAddressCreateAddress();你现在可以像这样重构你的类(当然你必须将你的字段更改为属性,但我假设你已经将它们作为属性://如果你的原始部分类是自动生成的,没关系将这个定义放在另一个文件中,只要//命名空间、类名和编译单元(必须在同一个项目中)是相同的publicpartialclassAddressList:ICommonAddress{intid{get;set;}Modemode{get;set;}Creatorcreator{get;set;}long[]siteList{get;set;}ATypeClass[]cspList;ICommonAddressCreateAddress(){returnnewAddressList();//注意:你可以甚至让你的ctor私有!}}如果你对每个AddressList类型都这样做,你可以改变通用方法如下,它会自动工作,包括IntelliSense以显示公共属性。此外,将其实现为扩展方法,以便它适用于所有AddressList类型(在您的情况下,这比使用部分更好):publicTToPrivateAddressList(thisICommonAddress_this)创建地址();//这现在可以正常工作,无需转换privAddrList.creator=_this.creator;privAddrList.id=_this.id;privAddrList.name=_this.name;privAddrList.mode=_this.mode;现在,如果您导入对此扩展方法的引用,那么您可以在您拥有的任何类型上调用ToPrivateAddressList():A.AddressLista_address=A.AddressList.CreateAddress();//或newA.AddressList()B.AddressListal1=a_address.ToPrivateAddressList();C.AddressListal1=a_address.AddressList.ToPrivateAddressList();如果我对你的问题不满意namespaceA{publicclassMyClass{...}}andnamepsaceB{publicclassMyClass{...}}你的问题是:我如何定义有时处理A.MyClass的“泛型”和其他情况B.MyClass在同一功能中。如果您将名称空间视为类型定义的一部分,我认为事情就变得很清楚了。这就像您有两种不同的类型,并且希望有一个共同点适用于它们。该通用类知道何时选择A.MyClass方法以及何时选择B.MyClass方法。如果这不是您要求的,请澄清。你问你如何做到这一点:namespaceOld{publicNew.AddressFoo(){New.Addressresult;//...返回结果;}}无需说“新”。每次出现地址?但如果不这样做,代码是否使用Old.Address?您可以从该项目的构建/链接中删除Old.Address(使用此代码)吗?以上就是C#学习教程:如何给方法传递命名空间?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: