在C#中,类可以返回两种不同类型的对象,需要遍历它们

问题描述 投票:4回答:1

我对C#并不陌生,但是我并没有真正使用过泛型和DI,但是我遇到了一个自学项目,因此我借此机会。这是场景(很长,感谢您的耐心配合)...

我们有一个托管Web服务的本地解决方案。我有一个应用程序,可以通过这些Web服务获取信息并为我们的合作伙伴之一生成数据文件。我们正在从本地解决方案过渡到基于云的解决方案(相同的供应商,相同的Web服务,在云中的实现略有不同)。我认为最好通过执行以下操作来学习接口(比我现在知道的更多),泛型(我在键入时正在学习的东西)和依赖项注入(也是该特定领域的初学者)。

为我正在调用的每个Web服务(即,具有返回列表的函数CallUserService的IGetUsers创建一个接口)为云解决方案和本地解决方案分别实施一次接口]

public class GetUsersCloud : IGetUsers { public List<string> CallUserService(int ID)... }

public class GetUsersPrems : IGetUsers { public List<string> CallUserService(int ID)... }

现在我有一个带有构造函数的类,该构造函数采用IGetUsers的实例

public class GetUsers {        
    private IGetUsers _getUsers;
    public GetUsers(IGetUsers getUsers) {
        _getUsers = getUsers;
}

[从这里,我可以使用处理本地解决方案或云解决方案的类的实例来实例化此类,并调用a

GetUsers getUsers;
if (!cloud) {
     getUsers = new GetUsers(new GetUsersPrems());
} else {
     getUsers = new GetUsers(new GetUsersCloud());
}
List<string> userList = getUsers.CallUserService(5);

这很好用,因为我的返回类型是一个列表,所以我可以很容易地处理它。这是我有点卡住的地方。

我有另一个接口要实现,但是将要实现它的类的Web服务将返回不同的类型。我的意思是,尽管这两个Web服务将返回一个称为UserDetailList的类型,但它们来自两个不同的强类型类,这些类是通过从本地和云解决方案中导入服务引用而创建的。为了解决这个问题,我创建了一个接口,该接口的函数返回一个泛型

public interface IUserDetails {
    T GetUserDetails<T>(int ID);
}

我的类实现看起来像这样(显然缺少了肉和土豆,但您明白了)

public class GetUserDetailsCloud : IUserDetails {
    public T FetchUserDetails<T>(int ID) { 
          CloudWS.UserDetailList userDetailList = cloudWebservice.GetUserDetailList(ID);
          return (T)(object)userDetailList;
    }
}

public class GetUserDetailsPrems : IUserDetails {
    public T FetchUserDetails<T>(int ID) { 
          PremsWS.UserDetailList userDetailList = premsWebservice.GetUserDetailList(ID);
          return (T)(object)userDetailList;
    }
}

我创建一个带有IUserDetails实例的构造函数的类

public class GetUserDetails{        
    private IUserDetails _getUserDetails;
    public GetUserDetails(IUserDetails getUserDetails) {
        _getUserDetails= getUserDetails;            
    }
}

现在很容易,我可以根据是否在云上进行实例化:

GetUserDetails getUserDetails;     
object userDetailsResults;
if (!cloud) {
     getUserDetails = new GetUserDetails (new GetUserDetailsPrems());
     userDetailsResults = getUserDetails.FetchUserDetails<PremsWS.UserDetailList>(ID);  
} else {
     getUserDetails = new GetUserDetails (new GetUserDetailsCloud());
     userDetailsResults = getUserDetails.FetchUserDetails<CloudWS.UserDetailList>(ID);
}

这是我卡住的地方。由于这两个Web服务具有不同的类型,因此我将其调用并根据是否云计算传递类型,然后将结果存储在一个对象中,而不是作为强类型类的实例。我的下一步涉及遍历结果并执行操作/填充输出文件。我曾经可以说一种类型...

foreach (PremsWS.UserDetail in userDetailsResults) {
    <do some trivial stuff here>
}

现在在我看来,我不得不编写两个单独的函数来遍历数据并处理结果。我觉得应该有一种方法可以编写一个接受通用类型的函数,然后根据其类型(无论是云实例还是本地实例)来处理结果。

我一直坐在这里试图弄清楚,而我的Google未能使我找到教程或任何可以使我朝正确方向指出的东西,我会很感激。

我对C#并不陌生,但是我并没有真正使用过泛型和DI,但是我遇到了一个自学项目,因此我借此机会。这是场景(很长,我感谢您...

c#
1个回答
0
投票

理想的路径是从GetUserDetailList返回相同的类型。由于这似乎不是一种选择,因此将两种返回类型都视为相同的名称在实现它们的分隔时会造成一些伤害。

© www.soinside.com 2019 - 2024. All rights reserved.