如何将相同功能的方法合并为一个

时间:2017-09-23 12:35:33

标签: c#

我有2个名称空间,它们在同一个C#源代码文件中使用。这两个名称空间来自第三方SOAP Web服务 它们包含相同名称的代理类,如Person和Address。这些类具有相同的结构,我无法修改 因为它们是由Visual Studio自动代码生成的

namespaceA.Person
namespaceA.Address

namespaceB.Person
namespaceB.Address

Visual Studio自动代码生成的代理类的详细信息:

public class Person{
    public string FirstName {get;set;}
    public string LastName {get;set;}

    // complex type property
    public Address Adress {get;set;}
}

public class Address{
    public string StreetLine1 {get;set;}
    public string StreetLine2 {get;set;}

    public string City {get;set;}
    public string Province {get;set;}
    public string CountryCode {get;set;}
}

我编写了2个具有不同名称但它们执行相同功能的方法,并且我必须使用完整的命名空间标识符来避免同一个C#代码文件中的命名空间冲突。 我想将这两个方法组合成1并摆脱源代码重复。谢谢你的帮助。

执行相同功能的两种方法:

public namespaceA.Person SetPersonForNameSpaceA(string fn, string ln, string sl1, string sl2, string city, string prv, string cc)
{
    var p = new namespaceA.Person
    {
        FirstName = fn,
        LastName = ln,

        Address = new namespaceA.Address
        {
            StreetLine1 = sl1,
            StreetLine2 = sl2,
            City = city
            Province = prv,
            CountryCode = cc
        }
    };

    return p;
}

public namespaceB.Person SetPersonForNameSpaceB(string fn, string ln, string sl1, string sl2, string city, string prv, string cc)
{
    var p = new namespaceB.Person
    {
        FirstName = fn,
        LastName = ln,

        Address = new namespaceB.Address
        {
            StreetLine1 = sl1,
            StreetLine2 = sl2,
            City = city
            Province = prv,
            CountryCode = cc
        }
    };

    return p;
}

我想只有一个方法,并且该方法必须正确绑定到基于使用者上下文使用选项的命名空间的具体类。问号(?)是我的代码问题。我尝试使用泛型类型T,但我失败了,因为T的属性在VS中编码时会导致编译错误。

public ? SetPerson(string fn, string ln, string sl1, string sl2, string city, string prv, string cc)
{
    var p = new ?
    {
        FirstName = fn,
        LastName = ln,

        Address = new ?
        {
            StreetLine1 = sl1,
            StreetLine2 = sl2,
            City = city
            Province = prv,
            CountryCode = cc
        }
    };

    return p;
}

1 个答案:

答案 0 :(得分:2)

  1. 通常自动生成的类为partial。看看你是否可以调整你的发电机。在这种情况下,您可以引入一个通用接口。请参阅partial classes

  2. 如果(1)不是一个选项,只需使用dynamic关键字。

    public TPerson SetPerson<TPerson, TAddress>(string fn, string ln, string sl1, string sl2, string city, string prv, string cc) where TPerson : new() where TAddress : new()
    {
        var p = new TPerson();
        dynamic dp = p;
    
        dp.FirstName = fn;
        dp.LastName = fn;
    
        dynamic addr = new TAddress();
        dp.Address = addr;  
        addr.City = city;
    
        // ...
    
        return  p;
    }
    

    然后这样打电话:

    SetPerson<namespaceA.Person, namespaceA.Address>("1", "2", "3", "4", "5", "6", "7")
    SetPerson<namespaceB.Person, namespaceB.Address>("1", "2", "3", "4", "5", "6", "7")