2010-12-13 66 views
2

我對泛型和作爲一個學習練習相當陌生我試圖創建一個簡單的方法,從具有指定ID的實體集(表)中選擇一個實體。c#Linq to SQL和泛型

public T GetEntity<T>(int id) where T : class 
    { 
     return db.GetTable<T>().SingleOrDefault(o => o.id == id); 
    } 

以上顯然不會工作,因爲oo.id是未知的,因此不能訪問屬性id - 有人可以與如何實現這一點幫助?

回答

1

如果你不能改變你的實體類(用於實現一個共同的接口),你可以使用一個斷言函數,並將其傳遞到方法

public T GetEntity<T>(int id, Func<T, int, bool> predicate) where T : class 
{ 
    return db.GetTable<T>().SingleOrDefault(o => predicate(o,id)); 
} 
4

如果你所有的實體包含id屬性,那麼你可以定義一個接口

public interface IEntity 
{ 
    int id { get; } 
} 

實現它所有的課程和改變你的方法

public T GetEntity<T>(int id) where T : IEntity 
{ 
    return db.GetTable<T>().SingleOrDefault(o => o.id == id); 
} 

這樣的接口可以有效用於所有你想爲你的實體做點事情的地方,比如說。按ID刪除。你可以添加更多的屬性到你的界面,即。時間戳。

0

你需要在你的T上設置一個約束,所以編譯器可以確定有一個id屬性。一種方法是使用接口,即。

public interface IUnique 
{ 
    int id { get; set; } 
} 

那麼你可以說

public T GetEntity<T>(int id) where T : class, IUnique 
{ 
    return db.GetTable<T>().SingleOrDefault(o => o.id == id); 
} 
1

另一種解決方案,不建議性能方面的原因,但我無論如何應張貼。

public T GetEntity<T>(int id) where T : class 
    { 

     return db.GetTable<T>().AsEnumerable().SingleOrDefault(o => (int)o.GetType().GetProperty("Id").GetValue(o,null) == id); 

    }