2016-07-29 62 views
1

我在搜索中找不到答案。C#不同類別的列表

我需要一個包含不同類的列表,每個類都固有基類BaseA,但每個類都具有其他不具備的屬性,或者某些使用相同類的屬性。現在

public class BaseA 
{ 
    public int ID = 0; 
} 

public class AA : BaseA 
{ 
    public int AID = 0; 
} 

public class AB : BaseA 
{ 
    public int BID = 1; 
} 

public class AC : BaseA 
{ 
    public int CID = 0; 
} 

的問題是如何得到可能含有類AA,AB和AC,編輯器會不會覺得我只是他們的一個工作一個列表。

我試圖製作List<BaseA>,但是這隻會暴露bassA屬性,而我需要的是能夠做到List[0].AID,在那裏它會理解AID的含義,如果我正在談論AA類。

我可能會這樣做都錯了,有人可以指向正確的方向嗎?

+2

聽起來好像你有設計缺陷。回去一步,並決定是否應該有這些類別的共享列表 – Default

+0

您可能是對的,但這些類別的共享列表是一個更好的解決方案,然後將9個列表進行低谷。 – ImtehQ

+0

如果您必須有9種不同的方式才能從單個列表中提取數據,則可能不會。 – Default

回答

0

您可以嘗試使用的LINQ此:

List<BaseA> list = ... 

    var result = list 
    .OfType<AA>() // Filter out AA instances only 
    .ElementAt(0) // or just First(); 
    .AID; 
0

你正在尋找鑄造,也許?

var list = new List<BaseA> 
{ 
    new AA(), 
    new AB(), 
    new AC(), 
} 

var aa = list[0] as AA; 

if (aa != null) 
{ 
    var id = aa.AID; 
} 
0

就需要下在基類變量或屬性,用於存儲它是什麼類型然後試圖鑄造(列表[0]爲AA),如果沒有返回null使用新投對象選擇所需的變量。

真正的問題是爲什麼派生類需要自己的ID變量,特別是如果您根據所述ID將它們放入列表中。

+0

ID和AID或BID僅僅是一個例子;) – ImtehQ

0

有一種簡單而優雅的方法可以做到這一點。提供基類的抽象方法(或它們的倍數):

public abstract void AID(parameters); 

而且在每一類中重寫方法,做好相關的那類特定的事情。

或者你可以採取另一種方式;檢查每個對象,如果它的每個類的類型:

if(obj is AA){ 
//do AA stuff 
} 
if(obj is AB){ 
//do AB stuff 
} 
if(obj is AC){ 
//do AC stuff 
} 
0

幾種方法可以嘗試,

  1. 你的方法去,投的項目在列表中((AA)List[0]).AID

你應該有目標有一定的瞭解,它屬於AA才能訪問它的屬性AID

,如果你的要求是僅限於你所描述,那麼我會建議你有類似的東西線下面提供

class BaseA 
{ 
    public string ObjectType { get; set; } //enum would be a good choice. 

    public int ID { get; set; } 
      (or) 
    public Dictionary<string,int> AllProperties { get; set; } 
} 

這種方法的使用情況,您可以檢查類的類型和調用適當的屬性。

+0

一個演員陣營將無法工作,因爲我必須投它多次。 我也嘗試枚舉的方式來找出它是什麼類型之前的一些代碼,但我想一定有更好的方式來做到這一點。 – ImtehQ