2017-05-07 2 views
2

Idプロパティにアクセスするにはどうすればよいですか?私は、次のコードを持っている:汎用インスタンスプロパティへのアクセス

public void InsertOrUpdate(Book book) 
{ 
    if (book.Id == default(int)) { 

をそして私は今、それが一般的なようにしたい:

public class TheRepository<T> : IRepository<T> where T : class 
{ 
    public void InsertOrUpdate(T instance) 
    { 
     if (instance.Id == default(int))//How can I access Id here 
     { 
      context.Set<T>().Add(instance); 

私は似た記事を検索し、私は私がinstance.GetType().GetProperty("Id").GetValue()ような何かを書くべきだと思いますが、私は方法がわかりません正確に?

答えて

1

このようなハックを行うことができます。 Idと呼ばれるタイプintの唯一の財産とのインタフェースを定義します。

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

次に、あなたエンティティがインタフェースを実装することを述べる:

public class Book : IHaveId 

最終状態あなたの一般的なリポジトリのクラスで使用されるタイプは、これを実装する必要があることをインタフェース。

public class TheRepository<T> : IRepository<T> where T : class, IHaveId 
{ 
    public void InsertOrUpdate(T instance) 
    { 
     if (instance.Id == default(int)) 
     { 
      context.Set<T>().Add(instance); 
     } 
    } 
} 

反射を使用しないようにするため、一般的に非常に高価です。さらに、コードがより明確になりました。

+0

私は既にIRepositoryという名前のインターフェースを持っています。これはエンティティフレームワークです。また、私はこれを 'Book 'ではなくThe The Repoitoryに適用したいと思っています。 –

+0

これで問題はありません。私は何か誤解していますか?おかげ – Christos

+0

は、私は、既存の 'IRepository'インターフェースにプロパティを追加したり、新しいインターフェイスを作成する意味しますか? –

0

現在、コンパイラは、それがクラスであることを除いて、Tの何も知らない。これは、Idプロパティを持たないTheRepository<string>のインスタンスを作成することを止めるものがないため、Idプロパティがあることを決して知らないことを意味します。

あなたの回答で言及したコードスニペットは、反射を使用してではなく、です。私が言及したように、文字列のリポジトリを作成するとどうなりますか?文字列にはIdプロパティがないため、このコードは必ず失敗します。あなたは、今

public abstract class DataObject 
{ 
    public int Id {get;set;} 
} 

public class Book : DataObject 
{} 

:あなたはこのケースで行う必要がありますどのような

は、あなたがリポジトリに固執する必要が任意の他のエンティティと一緒にクラスBookは、IDを含み、基本クラスを実装していることを確認していますDataObjectを継承するクラスにリポジトリを制限することができます。

public class TheRepository<T> : IRepository<T> where T : DataObject 

、コンパイラは関係なく、Tが何であるかのTの任意のインスタンスは、常にDataObjectを継承し、ひいてはIdプロペを持っていることが保証されますrty。

関連する問題