【问题标题】:how can I access a class from a subclass of type list如何从类型列表的子类访问一个类
【发布时间】:2010-10-07 23:39:35
【问题描述】:

我在 C# 中有以下代码,我试图找出为什么我无法从类型列表中的子类访问类地址的元素。这是代码

MemberList list = MemberDB.GetMembers("sql", m_page, 
    m_RecordPerPage, out count, _state);

/*******************************/

public static MemberList GetMembers(string sql, int page, 
    int pageSize, out int count, string parState)
{
    MemberList retval = new MemberList();

    SqlParameter pOut = new SqlParameter("@Count", SqlDbType.Int, 4);
    pOut.Direction = ParameterDirection.Output;

    SqlParameter[] param = new SqlParameter[]{
    new SqlParameter("@Sql", sql),
    new SqlParameter("@parState", parState),
    new SqlParameter("@Page", page),
    new SqlParameter("@PageSize", pageSize),
    pOut };

    using (SqlDataReader reader = SqlHelper.ExecuteReader(
        Helper.ConnectionString, CommandType.StoredProcedure, 
        "[app_Member_Search]", param))
    {
        while (reader.Read())
        //if (reader.Read())
        {
            retval.Add(Read(reader));
            //retval = Read(reader);
        }
    }

    count = Helper.ToInt32(pOut.Value);

    return retval;
}



public class Member
{
    private Address m_address;

    public Address Address
    {
        get { return m_address; }
        set { m_address = value; }
    }

    public Member()
    {
        m_address = new Address();
    }
}

public class MemberList : List<Member>
{
    public MemberList() { }
}


case "Address": 
    retval.Address.Address1 = Helper.ToString(reader[i]);
    //throw new Exception(Helper.ToString(reader[i]));
    //retval.Address1 = Helper.ToString(reader[i]);
    break;

case "Address2": 
    retval.Address.Address2 = Helper.ToString(reader[i]); 
    //retval.Address2 = Helper.ToString(reader[i]); 
    break;

case "City": 
    retval.Address.City = Helper.ToString(reader[i]);
    //retval.City = Helper.ToString(reader[i]); 
    break;

case "State": 
    retval.Address.State = Helper.ToString(reader[i]);
    //retval.State = Helper.ToString(reader[i]); 
    break;

【问题讨论】:

  • 请改写这个问题。

标签: c# list class


【解决方案1】:

我认为您的问题可能来自于对 MemberList 类的继承层次结构感到困惑。它实际上根本不是 member 的子类,它是 List(Of T) 的子类。当您将 T 替换为某个类名时,您只是说该列表应该是该类型的列表,但该列表仍然是一个列表,而不是该类型的子类。这是使用称为泛型的.net 功能。你可以阅读更多关于泛型的信息here

如果您的示例中的 switch 语句引用了您的第一个代码 sn-p 中可以看到的相同 retval,您将需要在列表中指定一个索引才能使其工作。如:

//index should be set to the correct index for the Member you are modifying
retval[index].Address.Address1 = "Some Value";

但是,这需要您在列表中添加一个新成员才能起作用。我可能会创建一个新的 Member 实例,在 switch 语句中设置属性,然后将其添加到最后的 MemberList 中。这样您就可以避免每次要设置属性时都必须索引到列表中,因此它是一种更简洁且稍快的解决方案(在执行时间和写入时间方面)。

【讨论】:

    【解决方案2】:

    在基类上引用公共或受保护的方法或属性时,请确保在其前面加上base.

    我写了一个非常抽象的例子,它应该引导你正确地了解如何从子类调用父类中的函数

    using System;
    
    namespace simpletest
    {
        class Program
        {
            static void Main(string[] args)
            {
                Bird sparrow = new Bird();
                Console.WriteLine("Is the bird flying? " + sparrow.IsFlying + "\n");
    
                Console.WriteLine("Make the bird fly.");
                sparrow.Fly();
                Console.WriteLine("Is the bird flying? " + sparrow.IsFlying + "\n");
    
                Console.WriteLine("Make the bird land.");
                sparrow.Land();
                Console.WriteLine("Is the bird flying? " + sparrow.IsFlying);
                Console.ReadLine();
            }
        }
    
        public abstract class Animal
        {
            bool _isMoving = false;
    
            protected bool IsMoving
            {
              get { return _isMoving; }
            }
    
            protected void StartMoving()
            {
                _isMoving = true;
            }
    
            protected void StopMoving()
            {
                _isMoving = false;
            }
        }
    
        public class Bird : Animal, IFlyable
        {
            public void Fly()
            {
                base.StartMoving();
            }
    
            public void Land()
            {
                base.StopMoving();
            }
    
            public bool IsFlying
            {
                get { return base.IsMoving; }
            }
        }
    
       interface IFlyable
       {
           void Fly();
           bool IsFlying { get; }
           void Land();
       }
    }
    

    【讨论】:

    • 我需要更多信息才能给你一个更具体的例子。你到底想做什么?
    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    相关资源
    最近更新 更多