2017-05-07 2 views
2

Wie kann ich auf die Id-Eigenschaft der instance zugreifen? Ich habe den folgenden Code:Zugriff auf generische Instanzeigenschaft

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

Und ich will es jetzt generic machen:

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); 

ich für Ähnliche Beiträge gesucht, und ich denke, dass ich so etwas wie instance.GetType().GetProperty("Id").GetValue() schreiben soll, aber ich weiß nicht, wie genau?

Antwort

1

Sie könnten einen solchen Hack machen. Definieren Sie eine Schnittstelle mit nur einer Eigenschaft vom Typ intId genannt:

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

Dann erklären, dass Sie Unternehmen der Schnittstelle implementiert:

public class Book : IHaveId 

Letzter Zustand, dass der Typ in Ihrer generischen Repository-Klasse verwendet wird, soll dies umzusetzen Schnittstelle.

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); 
     } 
    } 
} 

Dadurch vermeiden Sie die Verwendung von Reflexion, die in der Regel sehr teuer ist. Darüber hinaus ist Ihr Code jetzt klarer.

+0

Ich habe bereits eine Schnittstelle namens "IRepository". und das ist Entitätsrahmen. Und ich möchte das auch auf 'TheRepository' und nicht auf' Book' anwenden. –

+0

Ok, ich sehe kein Problem damit. Habe ich etwas falsch verstanden? Danke – Christos

+0

Meinst du, ich füge die Eigenschaft der vorhandenen 'IRepository'-Schnittstelle hinzu oder erstelle eine neue Schnittstelle? –

0

Derzeit weiß der Compiler nichts von T, außer dass es eine Klasse ist. Das bedeutet, dass es nie wissen kann, dass es eine Id -Eigenschaft hat, weil Sie nichts daran hindern können, eine Instanz von TheRepository<string> zu erstellen, die natürlich keine Id-Eigenschaft besitzt.

Das Code-Snippet, das Sie in Ihrer Antwort mit Reflektion erwähnen, ist nicht ein guter Weg, es zu tun. Was passiert, wenn Sie, wie bereits erwähnt, ein Repository mit Strings erstellen? Dieser Code wird notwendigerweise fehlschlagen, da Zeichenfolge die Id-Eigenschaft nicht aufweist.

Was Sie in diesem Fall tun müssen, ist sicher, dass Klasse Book, zusammen mit allen anderen Einheiten müssen Sie im Repository beharren, eine Basisklasse implementieren, die ID enthält:

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

public class Book : DataObject 
{} 

Jetzt, Sie Ihre Repository-Klassen zu beschränken, die DataObject erben:

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

Jetzt gewährleistet ist, der Compiler, dass jede Instanz von T, unabhängig davon, was T ist, immer DataObject erbt, und hat somit eine Id prope rty.

Verwandte Themen