2008-09-17 26 views
6

MVC mağazasından esinlenerek çalıştığım en yeni proje, sonuçları filtrelemek için IQueryable üzerinde uzantı yöntemleri kullanıyor.Genişletme Yöntemleri bir arabirim için çalışmaz

Bu arayüze sahibim;

IPrimaryKey 
{ 
    int ID { get; } 
} 

ve ben

public static IPrimaryKey GetByID(this IQueryable<IPrimaryKey> source, int id) 
{ 
    return source(obj => obj.ID == id); 
} 

ı IPrimaryKey uygulayan bir sınıf, SimpleObj var diyelim bu uzatma yöntemini var. IQuerID of SimpleObj'im olduğunda, ideal olarak daha az olan bir IPrimaryKey olan bir IQueryable olarak kullanılmadığı sürece GetByID yöntemi mevcut değildir.

Burada bir şey mi özlüyorum?

cevap

13

Çalışıyor Ben ObjectDataSource ile çalışmak için özel bir varlık çerçevesi çözümü tasarlanmış zaman

bu mümkündür, ben benzer bir model uygulamak zorunda kalmıştım , doğru yapıldığında. cfeduke'nin çözümü çalışıyor. Ancak, IPrimaryKey arayüzü umumi olması gerekmez, aslında, hiç orijinal tanımı değiştirmek gerekmez:

public static IPrimaryKey GetByID<T>(this IQueryable<T> source, int id) where T : IPrimaryKey 
{ 
    return source(obj => obj.ID == id); 
} 
+0

Mükemmel - Ben orijinal cevabı kabul edilmeyen ettik. Bunu yarın deneyeceğim. İkinizide tesekkurler. – Kirschstein

+1

Sadece cevabımın yanlış olmadığını söylemek istiyorum, bu onun kodunun çalışmadığı nedendir, ben sadece bir çözüm bulmaya zaman ayırmadım. Yukarı, daha iyi cevabınıza oy verdi. –

+0

Sadece çok küçük bir noktadır: IPrimaryKey // daha iyi entegrasyon: Bu (bu IQueryable kaynak ... – Kirschstein

2

Bu, jeneriklerin kalıtım kalıplarını takip etme yeteneğine sahip olmaması nedeniyle çalışamaz. yani. IQueryable <SimpleObj> IQueryable <IPrimaryKey>

4

Edit miras ağacında değildir: Konrad 'ın çözüm çünkü onun kadar basit iyidir. Aşağıdaki çözüm işe yarar ancak yalnızca ObjectDataSource'a benzer durumlarda, bir sınıf yönteminin miras hiyerarşisinde yürümeden yansıma aracılığıyla alındığı durumlarda gereklidir. Açıkçası bu burada olmayacak. Kullanım

public interface IPrimaryKey<T> where T : IPrimaryKey<T> 
{ 
    int Id { get; } 
} 

public static class IPrimaryKeyTExtension 
{ 
    public static IPrimaryKey<T> GetById<T>(this IQueryable<T> source, int id) where T : IPrimaryKey<T> 
    { 
     return source.Where(pk => pk.Id == id).SingleOrDefault(); 
    } 
} 

public class Person : IPrimaryKey<Person> 
{ 
    public int Id { get; set; } 
} 

Pasaj:

var people = new List<Person> 
{ 
    new Person { Id = 1 }, 
    new Person { Id = 2 }, 
    new Person { Id = 3 } 
}; 

var personOne = people.AsQueryable().GetById(1); 
İlgili konular