как я могу получить доступ к классу из подкласса списка типов - PullRequest
0 голосов
/ 17 февраля 2009

У меня есть следующий код в 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;

Ответы [ 2 ]

1 голос
/ 19 февраля 2009

Я думаю, что ваша проблема может быть в том, что вы запутались в иерархии наследования вашего MemberList класса. На самом деле это не подкласс члена, это подкласс List (Of T). Когда вы заменяете T на какое-то имя класса, все, что вы говорите, это то, что список должен быть списком этого типа, но список все равно является списком, а не подклассом этого типа. Это использует функцию .net, которая называется generics. Вы можете узнать больше о дженериках здесь .

Если оператор switch в вашем примере ссылается на тот же retval , который можно увидеть в вашем фрагменте кода кулака, вам потребуется указать индекс в списке, чтобы он работал. Такие как:

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

Однако для этого потребуется добавить нового участника в список, прежде чем это сработает. Я, вероятно, сделал бы новый экземпляр Member, установил бы свойства в операторе switch и затем добавил бы его в MemberList в конце. Таким образом, вам не придется индексировать список каждый раз, когда вы хотите установить свойство, чтобы оно было более чистым и немного более быстрым решением (как во время выполнения, так и во время записи).

0 голосов
/ 17 февраля 2009

При ссылке на открытый или защищенный метод или свойство в базовом классе обязательно добавьте к нему префикс 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();
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...