是否有可能重构此使用泛型?
问题描述:
使用LINQ到实体,我有以下代码:是否有可能重构此使用泛型?
public Foo GetFooByID(int id)
{
return _db.Foo.First(m => m.ID == id);
}
public Bar GetBarByID(int id)
{
return _db.Bar.First(m => m.ID == id);
}
有没有办法来重构这个使用泛型?
答
你可以做类似的LINQ to SQL的DataContext.GetTable方法:
public T GetById<T>(int id)
{
return _db.GetTable<T>().First(m => m.ID = id);
}
您需要调用它像这样:
GetById<Foo>(10);
GetById<Bar>(10);
答
你需要抽象的访问属性Foo
和首先在_db
上Bar
。然后泛型部分变得非常简单。
public T GetByID<T>(int id)
{
return _db.GetCollection<T>().First<T>(m => m.ID == id);
}
如果编译器抱怨,您可能需要将T约束为具有ID属性的类型。
public T GetByID<T>(int id) where T : IHaveID
{
}
这看起来完全像我所希望的,但LINQ到实体不使用的DataContext。 – chris 2009-12-02 15:27:48
您可以在_db上使用Type.GetProperties来查看它是否具有类型T的任何属性。 – scottm 2009-12-02 15:37:52
由于某种原因,Type.GetType(“myEDMX”)返回null。 – chris 2009-12-02 15:51:47