2016-07-26 27 views
0

私はIAp.csという名前のインターフェイスファイルを持っており、それは次のインターフェイスを実装:次にインターフェイスで定義され、C#でクラスに実装されたメソッドを呼び出す方法は?

public interface IAp 
{ 
    Output Process(double min, double max, IEnumerable<string> items); 
} 

を、私はこのように定義されたクラスがあります。

[Export(typeof(IAp))] 
public class Ap : IAp 
{ 
    readonly ISorter _sorter; 

    public Ap() 
    { 
     _sorter = ContainerProvider.Container.GetExportedValue<ISorter>(); 
    } 

    Output IAp.Process(double min, double max, IEnumerable<string> items) 
    { 
     // rest removed for brevity 
    } 
} 

ISorterインタフェースを、そしてContainerProviderクラスが定義されています次のように別々のファイルに保存します。

interface ISorter 
{ 
    string Sort(string token); 
} 

internal static class ContainerProvider 
{ 
    private static CompositionContainer container; 

    public static CompositionContainer Container 
    { 
     get 
     { 
      if (container == null) 
      { 
       List<AssemblyCatalog> catalogList = new List<AssemblyCatalog>(); 
       catalogList.Add(new AssemblyCatalog(typeof(ISorter).Assembly)); 
       container = new CompositionContainer(new AggregateCatalog(catalogList)); 
      } 

      return container; 
     } 
    } 
} 

私はProcessメソッドに電話したいと思います。私はこのようなものでした:

private readonly IAp _ap; 
Output res = _ap.Process(50, 100, items); 

をしかし、これは_apが割り当てされることはありませんと言い、そしてそれは、したがって、それはProcessメソッドを呼び出すことはありません、nullです。それはNullReferenceエラーをスローします。

私はまた、以下のようにクラスを初期化してみました:

private Ap app = new Ap(); 

しかし、私はそのメンバーにアクセスするapp.をすれば、次に、それはありません、Process方法を見つけることができません。別のソースファイルとクラスでProcessメソッドを呼び出す方法はありますか?

+0

を民間 'てみてくださいIAp app = new Ap(); ' –

答えて

4
private IAp app = new Ap(); 

ApIApを実装しているためです。明示的なインターフェイス実装を使用していたため、あなたがしようとしていたことを行うことができない理由は、インターフェイスメソッドはクラスではなくインターフェイスへの参照でのみ表示されます。

明示的なインターフェイスの実装の詳細については、Explicit Interface Implementation Tutorialを参照してください。

他の回避策は、明示的なインターフェイスの実装を使用しないことですが、これにより、通常はベストプラクティスとはみなされないタイプを直接参照する必要があります。

変更されたシグネチャの実装のみを示すコード。

public class Ap : IAp 
{ 
    public Output Process(double min, double max, IEnumerable<string> items) 
    { 
     // rest removed for brevity 
    } 
} 

現在、既存のリファレンスも使用できます。詳細については

また、インターフェイスが明示的に実装されているので、あなたが見ている動作ですInterfaces - C# Programming Guide

+1

ありがとうございました! – typos

4

あなたが好き(ApはインターフェースIApから継承しているように、それが原因で多型の合法的である)クラスをインスタンス化し、それがインタフェース型としての基準だ保持する必要があります。これは

private readonly IAp _ap = new Ap(); 
Output res = _ap.Process(50, 100, items); 
1

を参照してください。あなたは、1次の操作を実行する必要があります:暗黙的インタフェースを実装し

IAp _ap = new Ap(); //now you can do _app.Process 
    1. IAp型指定された変数にAppインスタンスを割り当て

      public class Ap: IAp 
      { 
          public Output Process(....) { ... } 
      } 
      
      Ap _ap = new Ap(); //now you can do _ap.Process 
      
  • 関連する問題