2017-12-11 17 views
-1

ASP-NET Core 2.0に汎用リポジトリとビジネスオブジェクトを持つ小さなアプリケーションフレームワークを構築しています。一般的なコンテキストでクラスの型を取得する

public interface IEntity 
{ 
    int Id { get; set; } 
} 

public class Person : IEntity 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class Repository<TEntity> where TEntity : IEntity 
{ 
    public Repository() 
    { 
     var myClass = typeof(TEntity); 
     var myClassName = myClass.Name; // I would expect "Person" - but it says "IEntity" - what am I doing wrong? 
    } 
} 

public abstract class BusinessBase<TEntity> where TEntity : IEntity 
{ 
    private Repository<IEntity> _repository { get; set; } 

    public BusinessBase() 
    { 
     var myClass = typeof(TEntity); 
     var myClassName = myClass.Name; // "Person" as expected 

     this._repository = new Repository<IEntity>(); 
    } 
} 

public class BusinessPerson : BusinessBase<Person> 
{ 
} 

var x = new BusinessPerson(); 

「リポジトリ」クラスのジェネリックTEntityの名前を読み取ろうとしていることに気づくでしょう。私はなぜそれが "人"を言っていないのか理解できませんでした。任意のアイデアや助け?

私のアプローチの一般的な設計についてここでは話しません。私の実際のプログラムは違って見えますが、私はできるだけ単純化しましたので、100行のコードを読む必要はありません。

+2

に見てあなたは '新しいリポジトリ()'と述べました。私はあなたが '新しいリポジトリが必要だと思う。()' –

+0

いいえ、申し訳ありませんが、これはコンパイルされません。 : – Ingmar

+2

'_repository'も同じ型にする必要があるので –

答えて

1

あなたが発生している問題は、_repositoryのあなたの宣言で発生しています。タイプを共変することなくIEntityとして定義しました。単純な解決策は、_repositoryの定義を次のように変更することです。

public abstract class BusinessBase<TEntity> where TEntity : IEntity 
{ 
    private Repository<TEntity> _repository { get; set; } 

    public BusinessBase() 
    { 
     var myClass = typeof(TEntity); 
     var myClassName = myClass.Name; // "Person" as expected 

     this._repository = new Repository<TEntity>(); 
    } 
} 

_repositoryをIEntityにする必要がある場合は、さらに多くの変更が必要になります。共分散https://stackoverflow.com/search?q=covariance

+0

すべての解説を読むのに気をつけたことはありますか? – InBetween

関連する問題