2011-10-28 6 views
3

を期待して、私は次のようしている:は、インターフェイスを実装していないオブジェクトを追加しますが、すべての資格を満たしている、リストにインターフェース

List<IReport> myList = new List<IReport>(); 

Report myReport = TheirApi.GetReport(); 

MYREPORTはiReportは、すべての資格を満たしているが、私は持っていないため、iReportはを実装することはできませんTheirApiのソースへのアクセス。 IReport型にキャストすると明らかにnullになり、インターフェイスに匿名型をキャストできないことがわかります。

ここにオプションはありますか?

ラッパークラスは、医師が注文したものだけだった。

ReportServices.GetAllCustomReports().ToList().ForEach(customReport => _customReports.Add(new ReportWrapper(customReport))); 

public class ReportWrapper : IReport 
{ 
    private Report inner; 

    public int ID 
    { 
     get { return inner.ID; } 
     set { inner.ID = value; } 
    } 
    public string Name 
    { 
     get { return inner.Name; } 
     set { inner.Name = value; } 
    } 

    public ReportWrapper(Report obj) 
    { 
     inner = obj; 
    } 
} 

答えて

5

をあなたがインターフェイスを実装し、別の1の内側に、このオブジェクトをラップする必要があります、その後、あなたはそれが内側のオブジェクトのプロパティを呼び出して実装する必要がありますし、メソッド。例えば

List<IReport> myList = new List<IReport>(); 
MyObjectIsLikeReport myReport = TheirApi.GetReport(); 
myList.Add(new ReportWrapper(myReport)); 
+0

わかりました。ありがとうございました! –

+0

残念ながら、これを行う自動化された方法はありません。さらに助けが必要な場合は、コメントを残してください。 =) –

+0

いいえ、これは絶対に完璧に機能しました!私のソリューションで編集。 –

1

はアダプターデザインパターンを考えてみましょう:

public class ReportWrapper : IReport 
{ 
    MyObjectIsLikeReport inner; 

    public ReportWrapper(MyObjectIsLikeReport obj) { 
     this.inner = obj; 
    } 

    public void ReportMethod(int value) { 
     this.inner.ReportMethod(value); 
    } 

    public int SomeProperty { 
     get { return this.inner.SomeProperty; } 
     set { this.inner.SomeProperty = value; } 
    } 
} 

それを使用するには、これを行うことができます。

定義: クライアントが期待する別のインターフェイスへのクラスのインタフェースを変換します。アダプタは互換性のないインターフェイスのために、そうでなければ できなかったクラスを一緒に動作させます。

良い参考:http://www.dofactory.com/Patterns/PatternAdapter.aspx

interface IReport 
{ 
    void DoSomething(); 
} 

class ReportApdapter : IReport 
{ 
    private readonly Report _report; 

    public ReportApdapter(Report report) 
    { 
     _report = report; 
    } 

    public void DoSomething() 
    { 
     _report.DoSomething(); 
    } 
} 

class Report 
{ 
    public void DoSomething() 
    { 
    } 
} 


//You can use like this. 
IReport report = new ReportApdapter(TheirApi.GetReport()); 
関連する問題