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

namespace MyOldService { public MyNewService.AddressList ToPrivateAddressList() { MyNewService.AddressList privAddrList = new MyNewService.AddressList(); privAddrList.creator = (MyNewService.AddressListCreator)this.creator; privAddrList.listId = this.listId; privAddrList.listIdSpecified = this.listIdSpecified; privAddrList.listName = this.listName; privAddrList.listType = (MyNewService.AddressingMode)this.listType; privAddrList.lastModified = this.lastModified; privAddrList.lastModifiedSpecified = this.lastModifiedFieldSpecified; if (this.siteList != null && this.listType == MyOldService.AddressingMode.XDAddressingModeSiteIDList) { privAddrList.siteList = new long[this.siteList.Length]; Array.Copy(this.siteList, privAddrList.siteList, this.siteList.Length); } ... 

最初编写的目的是将SOAP命名空间MyOldService中定义的列表复制到新命名空间MyNewService中的相同布局的类中。 问题是,对于soap类,如果我将MyOldService命名空间导入第三个命名空间,比如说MyOtherAppService,那么我的AddressList类就成为第三个命名空间的成员并被引用。

因此,我不想复制代码,而是想用类似于generics的东西来装饰它(或以某种方式调整它)(我理解它不会起作用,因为我正在改变命名空间,而不仅仅是一种固定类型[有我需要从每个命名空间中获取多个类型,从代码片段中可以看出,以允许它在需要的任何命名空间中将地址列表转换为相应的类。 可能?

编辑 :为了回应下面的一些评论,我将尝试定义一个更好的例子,说明我正在尝试做什么。

从WSDL通过Web引用导入的三个类(不,这些不会编译,只是用于说明的示例)。 类AddressList都具有相同的布局。

 namespace A { enum Mode {}; enum Creator {}; class ATypeClass {} public partial class AddressList { int id; enum Mode mode; enum Creator creator long[] siteList; ATypeClass[] cspList; } } namespace B { enum Mode {}; enum Creator {}; class BTypeClass {} public partial class AddressList { int id; enum Mode mode; enum Creator creator long[] siteList; BTypeClass[] cspList; } } namespace C { enum Mode {}; enum Creator {}; class CTypeClass {} public partial class AddressList { int id; string name; enum Mode mode; enum Creator creator long[] siteList; CTypeClass[] cspList; } } 

我将使用新方法扩展名称空间A中的分部类:

 namespace A { public partial class AddressList { public T.AddressList ToPrivateAddressList() { T.AddressList privAddrList = new T.AddressList(); 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 = new long[this.siteList.Length]; Array.Copy(this.siteList, privAddrList.siteList, this.siteList.Length); } ... } } } 

请注意,除了不同命名空间的每个部分的类之外,问题的一部分是来自不同命名空间的枚举。

最后,我设想这样称呼它(虽然我知道我实际上不能这样做,但我正在寻找一种大致同样优雅的解决方案):

 B.AddressList al1 = A.AddressList.ToPrivateAddressList(); C.AddressList al1 = A.AddressList.ToPrivateAddressList(); 

我认为你要找的是generics类型定义中的接口和where关键字。

从你的代码我看到你有这个:

  • 将类型A转换为类型B的方法
  • 它通过分配具有相同名称的属性来实现
  • 然后返回新类型B.
  • 类型可以驻留在不同的名称空间中(但目前具有相同的名称)
  • 课程是partial

您可以让每个类实现包含公共属性的接口,而不是依赖于相同的名称(您可以使用reflection来实现所需的效果)。 这样,您保留编译时类型安全性:

 public interface ICommonAddress { int id { get; set; } Mode mode { get; set; } Creator creator { get; set; } long[] siteList { get; set; } ICommonAddress CreateAddress(); } 

您现在可以像这样重构您的类(当然,您必须将您的字段更改为属性,但我假设您已将它们作为属性:

 // if your original partial class is auto-generated, it is ok to place // this definition in another file, it'll still work as long as // namespace, classname and compile-unit (must be in same project) are the same public partial class AddressList : ICommonAddress { int id { get; set; } Mode mode { get; set; } Creator creator { get; set; } long[] siteList { get; set; } ATypeClass[] cspList; ICommonAddress CreateAddress() { return new AddressList(); // NOTE: you can even have your ctor private! } } 

如果对每个AddressList类型执行此操作,则可以按如下方式更改通用方法,它将自动运行,包括显示常用属性的IntelliSense。 另外,将它实现为扩展方法,以便它适用于所有的AddressList类型(在您的情况下,这比使用partial更好):

 public T ToPrivateAddressList(this ICommonAddress _this) where T: ICommonAddress { T privAddrList = _this.CreateAddress(); // this now works normally, without casting privAddrList.creator = _this.creator; privAddrList.id = _this.id; privAddrList.name = _this.name; privAddrList.mode = _this.mode; } 

现在,如果您导入对此扩展方法的引用,则可以在您拥有的任何类型上调用ToPrivateAddressList()

 A.AddressList a_address = A.AddressList.CreateAddress(); // or new A.AddressList() B.AddressList al1 = a_address.ToPrivateAddressList(); C.AddressList al1 = a_address.AddressList.ToPrivateAddressList(); 

如果我对你的问题不满意

 namespace A { public class MyClass {... } } 

 namepsace B { public class MyClass {...} } 

你的问题是:我如何定义在同一函数中有时处理A.MyClass和其他情况B.MyClass “generics”。

如果您将名称空间视为类型定义一部分 ,我认为故事就变得清晰了。 就像你有两种不同的类型,并希望有一个适用于它们的通用。 那个generics类知道何时选择A.MyClass方法,何时选择B.MyClass方法。

如果不是您所要求的,请澄清。

你在问你如何做到这一点:

 namespace Old { public New.Address Foo() { New.Address result; //... return result; } } 

无需说“新”。 每次出现地址? 但如果你不这样做,代码使用Old.Address

你可以从这个项目的构建/链接中删除Old.Address(使用此代码)吗?