C# 有可能重构它以使用泛型吗?

C# 有可能重构它以使用泛型吗?,c#,generics,overloading,C#,Generics,Overloading,使用LINQ to实体,我有以下代码: 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方法的操作: public T GetById(int-id) { 首先返回_

使用LINQ to实体,我有以下代码:

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方法的操作:

public T GetById(int-id)
{
首先返回_db.GetTable()(m=>m.ID=ID);
}
那么你可以这样称呼它:

GetById<Foo>(10);
GetById<Bar>(10);
GetById(10);
GetById(10);

您需要首先抽象访问
\u db
上的属性
Foo
Bar
。然后,通用部分变得非常简单

public T GetByID<T>(int id) 
{
 return _db.GetCollection<T>().First<T>(m => m.ID == id);
}
public T GetByID(int-id)
{
首先返回_db.GetCollection()(m=>m.ID==ID);
}
如果编译器抱怨,您可能需要将T约束为具有ID属性的类型

public T GetByID<T>(int id) where T : IHaveID
{
}
public T GetByID(int-id),其中T:IHaveID
{
}

这看起来和我希望的完全一样,只是LINQ to Entities不使用DataContext。您可以在_db上使用Type.GetProperties来查看它是否有任何类型为t的属性。出于某种原因,Type.GetType(“myedx”)返回null。@chris如果使用完全限定名,则会得到一个类型而不是null。(如果您不确定完全限定名,请在“监视/即时”窗口中填写:typeof(yourtype).AssemblyQualifiedName(您也可以使用FullName)
public T GetByID<T>(int id) where T : IHaveID
{
}