2017-11-16 14 views
0

ジェネリックタイプのインターフェイスを共通インターフェイスにキャストするにはどうすればよいですか?ジェネリックタイプのインターフェイスを特定のインターフェイスにキャスト

我々は次のインタフェース/オブジェクト考えてみましょう:私たちは、コンソールアプリケーションでそれをコーディングしようと次に

public interface IAction : IAction<object> { } 
public interface IAction<T> 
{ 
    T PerformAction(); 
} 
public class SomeAction : IAction<string> 
{ 
    public string PerformAction() 
    { 
     return "some action result value"; 
    } 
} 
public class OtherAction : IAction<int> 
{ 
    public int PerformAction() 
    { 
     return 100; 
    } 
} 

を:私たちは変換できません」というエラーを回避するにはどうすればよい

List<IAction> actions = new List<IAction>(); 
actions.Add(new SomeAction()); 
actions.Add(new OtherAction()); 
actions.ForEach(e => Console.WriteLine(e.PerformAction())); 

「SomeAction」から「IAction」まで」?

+0

そうでない呼び出します。これらのオブジェクトは 'IAction'を実装していません。 'IAction'のリストに入れたいのであれば、実際にそのインターフェースを実装する必要があります(または、エラーメッセージが示すように、それらをオブジェクトに変換する必要があります)。 – Servy

+0

あなたが死んでいる場合は、ダックタイピングを調べてください。ダイナミックなキーワードはそれを可能にし、リフレクションによってそれを実現するナゲットライブラリもあります。その名前は忘れてしまいます。正直言って、あなたはおそらくあなたのデザインを再考する必要があります。 – James

+0

@James 'dynamic'は動的な型付け(したがって名前)を可能にします。ダックの型指定は、静的ではなく、動的ではなく暗黙的に行われます。 – Servy

答えて

2

継承階層が意味をなさない場合は、IAction<T>IActionに拡張する必要がありますが、それ以外の方法はありません。

また、IActionにコールする一般的なメソッドを追加する必要があります。メソッドの名前とパラメータが同じ場合は、明示的なインターフェイス実装を使用してメソッドを実装します。これはメソッドを呼び出す共通のインタフェースの実装上にあります。

public interface IAction 
{ 
    object PerformAction(); 
} 
public interface IAction<T> : IAction 
{ 
    new T PerformAction(); 
} 
public class SomeAction : IAction<string> 
{ 
    object IAction.PerformAction() 
    { 
     return PerformAction(); 
    } 

    public string PerformAction() 
    { 
     return "some action result value"; 
    } 
} 
public class OtherAction : IAction<int> 
{ 
    object IAction.PerformAction() 
    { 
     return PerformAction(); 
    } 
    public int PerformAction() 
    { 
     return 100; 
    } 
} 

コード

List<IAction> actions = new List<IAction>(); 
actions.Add(new SomeAction()); 
actions.Add(new OtherAction()); 
actions.ForEach(e => Console.WriteLine(e.PerformAction())); 
+1

これは完璧です!私の人生のために、私はそれが後ろ向きになっているのを見ることができませんでした!本当にありがとう :) – Vee

関連する問題