2012-02-22 35 views

回答

3

Draw方法應該在一個接口來定義:

public interface IDrawable 
{ 
    void Draw(); 
} 

所有其他類(以.Draw法)應實現此接口。而你的名單應該是List<IDrawable>。然後,你可以簡單地調用每個項目的.Draw方法預期:

List<IDrawable> list = new ...; 
foreach (var item in list) 
{ 
    item.Draw(); 
} 
0

他們都應該實現一個IDrawable接口。你的數組列表可能會包含一個IDrawable列表而不是對象。

1

除非你使用.NET 1.1,否則你不應該使用ArrayList

如果你在談論UI元素,他們都應該實現IDrawable接口。如果它們是您的自定義類型,那麼您也應該在這些類上實現IDrawable接口。然後您可以使用通用的List<T>來存儲它們。

List<IDrawable> objects = new List<IDrawable>(); 

// Fill the list 

// Iterate over each object and call Draw() 
foreach(IDrawable obj in objects) 
{ 
    obj.Draw(); 
} 
0

如果它們共享一個通用的接口,你可以到該接口。

如果類型的數量已知並且是固定的,請嘗試使用AS運算符投射到每個已知類型。

否則,你就不得不求助於反射,這樣的事情

for (i...){ 
    object oneObject = arrayList[i]; 
    Type objectType = oneObject.GetType(); 
    objectType.GetMethod("Draw").Invoke(oneObject, new object[0]); 
} 

但是如果你需要求助於的反映,是一個巨大的代碼的氣味,應該被避免。

0

隨着ArrayList所有的元素被存儲爲類型Object。要調用在antother類型上定義的函數,首先需要將成員轉換爲該類型。

class MyType { 
    public void Draw() { 
    ... 
    } 
} 

for (int i = 0; i < arrayList.Count; i++) { 
    MyType current = (MyType)arrayList[i]; 
    current.Draw(); 
} 

此代碼只能但如果存儲在ArrayList的對象轉換爲MyType。如果您使用.Net 2.0或更高版本,則完全避免使用ArrayList,而應使用List<MyType>。這是一個強類型的集合,並且完全避免了演員的需要。

List<MyType> list = ...; 
for (int i = 0; i < list.Count; i++) { 
    list[i].Draw(); 
} 
0

如果您正在使用C#4或更好,你可以使用這個動態類型:

foreach (dynamic obj in arrayList) 
    obj.Draw(); 

這將在運行時失敗,如果你有一個對象,其類型缺少匹配Draw()簽名。

如果您使用的是早期版本的C#,則可以使用反射。除此之外,你真的不應該使用ArrayList,除非你被某些遺留庫強制使用。正如其他人所認爲的,更習慣的解決方案是擁有一個IDrawable接口和一個List<IDrawable>

+0

在任何情況下都不應該將此解決方案作爲首選。 – 2012-02-22 21:27:08

+0

@KirkWoll我不同意。如果我無法控制arrayList或其內容的類型,例如,如果這些內容是通過調用傳統庫返回的,我會使用此解決方案。 – phoog 2012-02-22 21:31:42

+0

我還沒有遇到使用第三方庫迫使我放棄類型安全的場景。有很多[設計模式](http://en.wikipedia.org/wiki/Adapter_pattern)可以解決這類問題,而無需放棄靜態類型系統。無論如何,我們幾乎不同意 - 我說這不應該成爲你的第一選擇,如果你能控制代碼。 – 2012-02-22 21:34:43

相關問題