2009-02-16 9 views
0

J'ai le code suivant en C# et j'essaie de savoir pourquoi je ne suis pas capable d'accéder à partir d'une sous-classe qui est de type liste les éléments d'une adresse de classe . Voici le codecomment puis-je accéder à une classe d'une sous-classe de type liste

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; 
+0

Veuillez reformuler cette question. – CrashCodes

Répondre

0

Lorsque vous faites référence une méthode publique ou protégée ou d'un bien sur la classe de base, assurez-vous de préfixe avec base.

J'ai écrit un très abstrait exemple qui devrait vous conduire dans la bonne direction sur la façon d'appeler des fonctions dans une classe parente d'une sous-classe

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(); 
    } 
} 
+0

pouvez-vous m'envoyer un exemple – user67144

+0

J'ai besoin de plus d'informations afin de vous donner un exemple plus concret. Qu'est-ce que vous essayez de faire exactement? –

1

Je pense que votre problème peut venir d'être confus au sujet de la hiérarchie d'héritage de votre classe MemberList. Ce n'est pas vraiment une sous-classe de membre, c'est une sous-classe de List (Of T). Lorsque vous remplacez le T par un nom de classe, tout ce que vous dites est que la liste devrait être une liste de ce type, mais la liste est toujours une liste et non une sous-classe de ce type. Ceci utilise une fonctionnalité .net appelée génériques. Vous pouvez en savoir plus sur les génériques here. Si l'instruction switch de votre exemple fait référence au même retval que vous pouvez voir dans votre extrait de code fist, vous devrez spécifier un index dans la liste pour qu'il fonctionne. Tels que:

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

Cependant, cela nécessitera que vous ajoutiez un nouveau membre à la liste avant que cela puisse fonctionner. Je ferais probablement une nouvelle instance de membre, set est des propriétés dans l'instruction switch et ensuite l'ajouter à la MemberList à la fin. De cette façon, vous évitez d'avoir à indexer dans la liste chaque fois que vous voulez définir une propriété, c'est donc une solution plus propre et légèrement plus rapide (à la fois en temps d'exécution et en écriture).

Questions connexes