2012-02-22 5 views
0

基本的には、すべてがDraw()関数を持つさまざまな種類のオブジェクトのarraylistを持っています。私は各オブジェクトの描画機能を実行するためにループを使いたい。しかし、C#では、「オブジェクト」の型にその関数がないことがわかります。すべてのアイデアは、n00bが低いですか?arraylistに含まれるオブジェクトの実行メンバー関数?

public interface IDrawable 
{ 
    void Draw(); 
} 

.Draw方法で)あなたのすべての他のクラスは、このインタフェースを実装する必要があります。Draw方法は、インタフェースで定義されるべきであると

+1

.NET 2以降で使用可能な汎用コレクションを使用してください。 – ChaosPandion

答えて

3

あなたのリストはList<IDrawable>でなければなりません。予想通りその後、あなたは、単に各項目の.Drawメソッドを呼び出すことができます。彼らはすべてのIDrawableインタフェースを実装する必要があり

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

。あなたのarraylistはおそらくオブジェクトではなく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>を使用してください。これは強く型付けされたコレクションであり、キャストの必要性を全く避けます。あなたがそのタイプに一致Draw()署名が欠けているオブジェクトを持っている場合、これは実行時に失敗します

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

:あなたはC#4以上を使用している場合

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

、あなたは、このための動的な型を使用することができます。

以前のバージョンのC#を使用している場合は、リフレクションを使用できます。

これまでの説明では、従来のライブラリを余儀なくされていない限り、実際にはArrayListを使用してはいけません。他の人が示唆するように、より慣用的な解決策は、IDrawableインターフェイスとList<IDrawable>を持つことです。

+0

このソリューションは、最初の選択肢ではありません。 –

+0

@KirkWoll私は同意しません。 arrayListやその内容の型を制御できなかった場合、たとえば、レガシーライブラリへの呼び出しによって返された場合など、このソリューションを使用します。 – phoog

+0

私はまだサードパーティのライブラリを使用して型の安全性を放棄するというシナリオに遭遇しました。静的型システムの放棄に頼ることなく、この種の問題に対処するための[デザインパターン](http://en.wikipedia.org/wiki/Adapter_pattern)がたくさんあります。いずれにせよ、私たちはほとんど同意していません - あなたがコードを支配するなら、これがあなたの最初の*選択ではないと言いました。 –

関連する問題