2009-02-16 51 views
0

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

請重新說明這個問題。 – CrashCodes 2009-02-16 23:24:22

回答

0

當引用在基類中的公共或受保護的方法或屬性,一定要加前綴它與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(); 
    } 
} 
+0

你能給我發個例子嗎 – user67144 2009-02-16 23:25:10

1

我認爲你的問題可能是困惑的是未來您的MemberList類的繼承層次結構。它實際上不是成員的子類,它是List(Of T)的子類。當用一些類名替換T時,你所說的全部內容都應該是該類型的列表,但列表仍然是一個列表而不是該類型的子類。這是使用稱爲泛型的.net功能。你可以閱讀更多關於仿製藥here

如果您的示例中的switch語句指的是您的第一個代碼片段中可以看到的相同的retval,則需要在列表中指定一個索引以使其工作。如:

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

但是,這將需要您添加一個新的成員列表才能工作。我可能會創建一個新的成員實例,在switch語句中設置屬性,然後將其添加到最後的MemberList。這樣,您可以避免每次要設置屬性時都必須將索引編入列表,因此它是一種更乾淨,速度更快的解決方案(在執行時間和寫入時間方面)。

相關問題