在C#中为不同的类使用类型变量

时间:2018-02-21 13:28:57

标签: c# .net class generics inheritance

我的C#应用​​程序中有两个ServiceReference(通过VisualStudio生成):ServiceReference1和ServiceReference2。

两者都有相同的方法和类名。它们的接口在某些方法上有所不同,但我只想使用两者都具有相同接口的方法。

如何动态使用它们?

示例:

ServiceReference1.Client clnt1 = new ServiceReference1.Client();
ServiceReference2.Client clnt2 = new ServiceReference2.Client();

string result = "";    
if (type == 1)
   result = clnt1.calculate();
else
   result = clnt2.calculate();

string result2 = "";    
if (type == 1)
   result2 = clnt1.calculate2();
else
   result2 = clnt2.calculate2();

//and so on...

我正在寻找类似的东西......

ServiceReference1.Client clnt = null;
if (type == 1)
    clnt = new ServiceReference1.Client();
else
    clnt = new (ServiceReference1.Client)ServiceReference2.Client();

string result = clnt.calculate();   
string result2 = clnt.calculate2();  
//and so on...

由于ServiceReference1.Client拥有ServiceReference2.Client(以及更多)的所有方法,我认为它应该是可能的。但它不起作用。

var变量使用clnt也不起作用,因为客户端是在类中全局定义的,var只能在方法中使用。

1 个答案:

答案 0 :(得分:3)

我不知道你是如何生成这些的,但是大多数时候从Visual Studio获取生成的代码时,将类声明为partial classes是足够聪明的。

Visual Studio生成的代码

public partial class ServiceReference1
{
    public string Calculate()
    {
        // Implementation
    }
}

public partial class ServiceReference2
{
    public string Calculate()
    {
        // Implementation
    }
}

如果是这种情况,您可以做的是将自己单独的部分类文件添加到项目中以扩展它们。在新文件中,您可以使这些类实现一个通用接口。

您的代码

public partial class ServiceReference1 : IServiceReference
{
    // Nothing needed here
}

public partial class ServiceReference2 : IServiceReference
{
    // Nothing needed here
}

public interface IServiceReference
{
    string Calculate();
}

然后你可以像这样打电话给他们:

IServiceReference clnt = null;
if (type == 1)
    clnt = new ServiceReference1.Client();
else
    clnt = new ServiceReference2.Client();

string result = clnt.Calculate(); 
//and so on...