2011-01-08 21 views
1

Ich bin wieder Sorry, aber diese Frage Fortsetzung meiner ersten Frage: diese Schnittstelle berücksichtigen:Rückgabetyp von generischen Methoden

interface IRepository<T,U> where T:class where U:class 
{ 
    IEnumerable<U> SelectAll(); 

    bool Insert(T item); 

    IEnumerable<T> FindAll(Func<T, bool> exp); 
} 

und ich Implementieren Sie diese Schnittstelle:

public class Repository : IRepository<Customer,Select4ColumnsOfCustomers> 
{ 

    #region IRepository<Customer,Select4ColumnsOfCustomers> Members 

    public IEnumerable<Select4ColumnsOfCustomers> SelectAll() 
    { 
     throw new NotImplementedException(); 
    } 

    public bool Insert(Customer item) 
    { 
     throw new NotImplementedException(); 
    } 

    public IEnumerable<Customer> FindAll(Func<Customer, bool> exp) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

public class Select4ColumnsOfCustomers 
{ 
    public int CustomerID { get; set; } 
    public string Address { get; set; } 
    public string City { get; set; } 
    public string Phone { get; set; } 
} 

Ich möchte Geben Sie nur 4 Spalte der Customer-Tabelle in der Northwind-Datenbank zurück. Ok.this arbeiten, aber wenn ich eine andere Methode hinzufügen möchten, dass andere Arten zurückgeben muss ich erklären, S, U, M, W, ... im Interface und in der es umsetzen muss ich diesen Code schreiben:

public class Repository : IRepository<Customer,RetType1,RetType2,RetType3,....> 

das ist nicht gut.Was ist eine Alternative dafür.Ist es möglich, dass var für Rückgabetypen geschrieben wird oder ein Platzhalter für Rückgabetypen? danke

+0

Verwenden Sie 'Datatable' oder ein ORM für diese Art von Sache. – nan

Antwort

3

Ihr Repository kann mehrere Schnittstellen implementieren.

public class Repository : IRepository<TResult1, T1>, IRepository<Tresult2, T2>, etc... 

Ihre SelectAll Methode müssen generisch sein wie

TResult SelectAll<TResult>(); 

jedoch Andrzej richtig ist, sollten Sie eine ORM, so dass Sie diesen Code verallgemeinern kann. Überprüfen Sie NHiberante und Entity Framework.

+0

können Sie mir ein Beispiel in EF zeigen? – Arian

+0

@Nima, sorry ich habe eigentlich nicht viel Erfahrung mit EF. In NHibernate habe ich typischerweise eine Repository-Klasse erstellt, die CRUD-Operationen und eine Reihe von Query-Klassen für bestimmte Abfragen behandelt. – Vadim

Verwandte Themen