0

次のような方法を実現するにはどうすればよいですか?C#カスタム列名を持つ汎用リポジトリ

public interface IGenericRepository 
{ 
    int id { get; } 

    T GetById<T>() where T : class 
} 

public class GenericRepository : IGenericRepository 
{ 
    //Some code here 

    public T GetById<T>(int tid) where T : class 
    { 
     return from tbl in dataContext.GetTable<T> where tbl.id == tid select tbl; 
    } 
} 

そして、次のように私はこれを使用したいと思います。もちろん

GenericRepository gr = new GenericRepository(); 
Category cat = gr.GetById<Category>(15); 

、この用法では、tbl.id GenericRepositoryでは私にエラーを与えます。

SOLUTION

public class IHasId 
{ 
    public int id { get; set; } 
} 

public interface IGenericRepository 
{ 
    int id { get; } 

    T GetById<T>(int id) where T : IHasId; 
} 

public class GenericRepository : IGenericRepository 
{ 
    public int id 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public T GetById<T>(int id) where T : IHasId 
    { 
     return from tbl in dataContext.GetTable<T> where tbl.id == tid select tbl; 
    } 
} 

そして、これらとは別に、あなたのモデルでは、このどこかで定義することを忘れないでください

public partial class Category : IHasId { } 

と使用方法は次のとおりです。

Repository rep = new Repository(); 
Category cat = rep.GetById<Category>(15); 

答えて

1
public class IHasId 
{ 
    public int id { get; set; } 
} 

public interface IGenericRepository<T> 
{ 
    int id { get; } 

    T GetById(int id); 
} 

public class GenericRepository<T> : IGenericRepository<T> where T : IHasId 
{ 
    public int id 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public T GetById(int id) 
    { 
     return from tbl in dataContext.GetTable<T> where tbl.id == tid select tbl; 
    } 
} 
+0

くそー!私は最終的に問題を理解しました。これらのコードとは別に、私が使用する各エンティティの部分クラスを作成しなければなりませんでした。私がカテゴリテーブルを持っていると言うと、私はIBaseの継承を使ってパブリック部分カテゴリを作成しなければならなかった!ありがとう、相棒!! – Shaokan

+1

Ihasied inheritance sorry :) – Shaokan

1

すべてのクラスを受け入れるため、このエラーが発生しますwhere T : class。クラスにはそのプロパティがありません。

このプロパティが存在することを確認する抽象クラスまたはインターフェイスを作成し、where T : classwhere T : IHasIdPropertyに変更します。

+0

しかし、私はgr.GetById (15)を使用する場合、私はのようにwhere句を変更すると、それは、@dknaack、実際 – Shaokan

+0

を@dknaack、私はそれがIhasIdPropertyにカテゴリーを変換することはできませんというエラーを与えますT:IHasID、そしてdataContext.GetTable は私にエラー – Shaokan

+0

を与えるでしょう。 – dknaack

2

ここにはいくつかの問題があります。まず、一致するジェネリックタイプはクラスですが、クラスには 'id'というプロパティはありません。あなたはCategoryクラスは、「ID」プロパティを公開するインターフェイスを実装しておく必要があります。

public interface IIdentity 
{ 
    int identity { get; set; } 
} 

public class Category : IIdentity 
{ 
    public int identity{ get; set; } 
} 

あなたはIGenericRepositoryインターフェイスのプロパティとして「ID」を公開しました、なぜ私にはわからない - 確かにこれは想定されfindメソッドに渡されるパラメータになります(実装によって示されます)。私が上記に提案しましたインタフェースを使用して

where T : IIdentity 

のようなものに

where T : class 

:あなたはまたから「GetById」メソッドの制限を変更する必要があります。

+0

お返事ありがとう@Dave。しかし、問題は、T:classをIIdentityに変更すると、Tがこのコンテキストでテーブル名の変数のように動作するため、dataContext.GetTable が動作しなくなることです。または私はこの作業を得ることができません、私は知らない... – Shaokan

+0

どのようなエラーメッセージがありますか? – Dave

+0

私は問題を解決しました。私は質問を編集します:) – Shaokan

関連する問題