2011-11-21 4 views
0

私はインターフェイスを実装する3つのクラスがあり、そのようなオブジェクトを受け入れるメソッドが1つ必要です。例えばインターフェース:クラスのクラスのメソッドパラメータをキャストします。インターフェイス関連

public interface IFoo { 
    void DoThis(); 
} 

ワン:

public class Bar: IFoo { 
    public void DoThis(); 
} 

そして、私はつまり、フォーム上で、持っていると思います方法:

private void DoStuff(object o){ 
    o.DoThis(); 
} 

私がいることを達成することができますどのように私はDoStuff(object o)メソッドでDoThis()メソッドを呼び出すことができますか?

答えて

4

はそうのようなあなたの方法を宣言::

private void DoStuff(IFoo o){ 
      o.DoThis(); 
    } 

をそうしないと、IFooインターフェイスメンバを使用することはできません。

0

これは動作するはずです:

private void DoStuff(IFoo o){ 
    o.DoThis(); 
} 

またはこの:

private void DoStuff(object o){ 
    IFoo ifoo; 
    try 
    { 
     ifoo = (IFoo)o; 
    } 
    catch(InvalidCastException ice) 
    { 
     /* whatever "this isn't IFoo" logic you want here */ 
     throw; 
    } 
    ifoo.DoThis(); 
} 
+1

実行時にInvalidCastExceptionが取得より良いオプションは、一般的にあります。 –

3
private void DoStuff<T>(T o) where T : IFoo 
{ 
    o.DoThis(); 
} 

OR

private void DoStuff(object o) 
{ 
    IFoo foo = o as IFoo; 
    if (foo != null) 
    { 
     foo.DoThis(); 
    } 
} 
0

署名が変更できない場合は別のオプション:

private void DoStuff(object o){ 
    IFoo foo = (IFoo) o;  
    foo.DoThis(); 
} 
関連する問題