2017-11-24 19 views
0

ジェネリック型を使用してそれをベースフォームにキャストすることを理解し、理解するのは苦労しています。下のコードは私が持っている構造を示しています。ジェネリック型キャストと割り当て可能なタイプ

public interface IBaseRepository : IDisposable 
{ 
    //stuff defined 
} 

public class BaseRepository : IBaseRepository 
{ 
    //stuff I want to access 
} 

public interface IBaseController<TRepo> where TRepo : IBaseRepository 
{ 
    TRepo Repository { get; } 
} 

public abstract partial class BaseController<TRepo> 
    : Controller, IBaseController<TRepo> 
     where TRepo : IBaseRepository 
{  
    public virtual TRepo Repository { get; protected set; } 
} 

public interface ISpecificRepository : IBaseRepository 
{ 
} 

public class SpecificRepository : BaseRepository, ISpecificRepository 
{ 
} 

public class SpecificController : BaseController<ISpecificRepository> 
{ 
} 

// The below cast will only work if the controller 
// specifically implements IBaseController<IBaseRepository> 
var _controller = filterContext.Controller as IBaseController<IBaseRepository> 

それが特異的BaseRepository具象クラスではなく継承したクラスのいずれかを実装していない限り、私はIBaseControllerにコントローラをキャストすることはできません。

この例を使用すると、コントローラクラスがSpecificControllerの場合、BaseRepositoryのメソッドとプロパティにどのようにアクセスできますか?

私は何をしようとしているのかについてより具体的に質問を編集しました。

+0

SpecificController:

class Animal { } class Dog : Animal { } List<Dog> dogs = new List<Dog>(); List<Animal> animals = new List<Animal>(); List<Animal> dogsAsAnimals = dog as List<Animal>; // wrong List<Dog> animalsAsDogs = animals as List<Dog>; // wrong IList<Animal> newAnimals = animals as IList<Animal>; // correct 

し、最終的に

animals.Add(new Dog()); // correct 

はそうあなたのコードを使用します。 BaseControllerにはRepositoryプロパティがあります。したがって、このプロパティを介してリポジトリにアクセスしてください。 – CodeFuller

+0

@ CodeFuller申し訳ありません私は私の質問で非常に明確ではなかった。私はそれを更新しました。うまくいけば、私が苦労している場所についてより具体的です。 – Guy

+0

あなたの 'IBaseController 'が共変--IBaseController ' – Evk

答えて

0

だから、私たちはSpecificControllerがBaseController

  • BaseControllerは、コントローラを拡張し、だから、参照あなたに基づかIBaseController(タイプに基づか)
  • を実装して拡張し
    1. ので、その後filterContext.ControllerがあなたのSpecificControllerのインスタンスであると仮定できましたSpecificControllerをIBaseControllerとして使用することができます

    IBaseReposiジェネリック型コードで

    public class SpecificController : BaseController<IBaseRepository> 
    

    のようなあなたのジェネリック仕様使用コード内の保守党は、あなたは右のタイプを定義する必要があります - あなたは、親/子にオブジェクトをキャストすることはできません。例えば。親BaseControllerからパブリックまたは保護されたメンバーにアクセスすることができます

    var _controller = filterContext.Controller as IBaseController<ISpecificRepository> 
    
  • 関連する問題