【问题标题】:Generic function in VB.netVB.net 中的通用函数
【发布时间】:2014-12-07 03:55:24
【问题描述】:

我有 2 个不同的用户帐户类型,它们都存储在各自的表中(成员表中的成员和管理员表中的管理员)。

现在我想创建一个通用函数来访问任何类型用户的用户信息,所以我一直在寻找通用函数,但我坚持返回各自的类,

我已经创建了 2 个普通类 MemberInfo管理员用户的用户和 AdminInfo

现在如果传递给这个函数的泛型类是 MemberInfo,那么它应该处理普通用户详细信息并返回 MemberInfo 类,如果是管理员用户,那么它应该返回 AdminInfo 类。

这是我尝试过但无法实现目标的方法。

Public Function GetAllMembers(Of T)(ByVal accountType As AccountType) As List(Of T)
        Dim T_ReturnValue As List(Of T)
        Dim returnType As Type = GetType(T)
        If returnType Is GetType(MemberInfo) Then

            Dim _list As New List(Of MemberInfo)
            With New OleDbDataAdapter("SELECT ACCOUNT_NO, COUNTRY FROM Member", Globals.DatabaseConnection)
                Dim dt As New DataTable
                .Fill(dt)
                For Each row As DataRow In dt.Rows
                    Dim memberInfo As New MemberInfo
                    memberInfo.AccountNo = row("Account_No").ToString
                    memberInfo.Country = row("Country").ToString
                    _list.Add(memberInfo)
                Next
            End With
            Return DirectCast(_list, List(Of T))
        End If
    End Function

谁能帮助我如何返回相应的课程,现在我只想返回 memberinfo 课程。

【问题讨论】:

    标签: asp.net vb.net generics generic-list


    【解决方案1】:

    两种方式:

    1. 您可以有两个返回不同类的重载函数。

    2. 您可以声明函数as Object,并返回任一类。

    【讨论】:

    • 我想一定是。不过,我从来没有使用过泛型函数,所以我不能对此做出太多贡献。
    【解决方案2】:

    您可以按照以下步骤操作。

    1. 创建一个抽象类说"User"。然后MemberAdmin 必须扩展该基类user。假设两者都具有相同的属性集,这就是您开始使用T 使其通用的原因。但正如您所说,两者都有不同的数据库表存储。
    2. 如果您为MemberAdmin 定义了不同的方法,您可以使用接口将它们隔离。说Member可以Send加好友请求,所以你可以有一个接口(说ISendRequest),它只有Send方法定义。如果Admin可以Add新成员,那么你可以有接口说IAddMemberAdmin将实现IAddMemberMember将实现ISendRequest

    关键点 现在,定义一个接口说IGetAllUser,方法是GetAllUserUser 类必须实现它,但它会有抽象方法GetAllUser。所以这里的重点是你必须写这个GetAllMembers,而不是每个派生类都有方法来获取相应的 List 。

    示例代码 sn-p。如果 Member 和 Admin 都具有不同的属性,这甚至可以适应这种情况。

    但是如果你有相同的属性,那么你可以在基类中定义一个函数,它接受Datatable 并设置所需的属性,因为成员和管理员都具有相同的属性。因此,在 Member 和 Admin 类中实现 GetAllUsers 的唯一目的是将所需的 table 名称传递给数据访问层并获取 DataTable 并将其传递给基类中定义的函数以设置所需的属性并构建 User 的列表。

    public interface IGetAllUsers
    {
        List<User> GetAllUsers();
    }
    
    abstract class User : IGetAllUsers
    {
        public abstract List<User> GetAllUsers();
    }
    
    
    class Member : User
    {
        public override List<Member> GetAllUsers()
        {
                // Assuming there is data access layer, to get details
        }
    }
    
    
    class Admin : User
    {
        public override List<Admin> GetAllUsers()
        {
            // Get all admin
        }
    }
    

    【讨论】:

      【解决方案3】:

      没错。在解决您的具体问题之前,我想从较低级别开始。

      理论上,管理员一个用户,因此在数据库级别应该实现这一点,以便有一个 [Users] 表来存储包括管理员在内的各种用户。然后,您应该添加另一个名为 [Admins] 的表,该表通过 FK 链接到 [Users] 表并存储仅与管理员相关的所有其他字段。这在RDBMS理论中称为ISA/继承关系。

      在应用程序级别,这将转换为两个业务类,一个用于 [User],另一个用于 [Admin],其中 [Admin] 将继承自 [User] 类。然后,您可以编写一个返回 [User] 对象的函数。由于 [Admin] 继承自 [User],多态性将允许您从同一函数返回 [Admin] 对象。然后,您的调用者可以通过类型检查来确认返回的对象类型,或者您可以在 [Users] 表中存储一个名为 IsAdmin 的布尔字段,这对于管理员来说是正确的。

      【讨论】:

      • 是的,你是对的,结构应该如你所说,但问题是这只是维护项目,业主还没有准备好从头开始重新开发。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2012-08-12
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多