繁体   English   中英

如何从类型列表的子类访问类

[英]how can I access a class from a subclass of type list

我在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;

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

如果您的示例中的switch语句所引用的retval与您的第一段代码相同,则需要在列表中指定一个索引才能使其正常工作。 如:

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

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

在基类上引用公共或受保护的方法或属性时,请确保在基类前添加前缀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();
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM