我使用的是MVC3, c#, Razor和EF 5。
我正在构建一个泛型类,可以在其构造函数(即"Order")中采用不同的实体,因此我的调用代码可能看起来像。我刚刚意识到,我只需要传递类型名称而不是对象实例,那么这会是什么样子呢:
ef_generic my_ef_generic = new ef_generic("Test",Order)
目前我的签名是这样的。这是错误的,因为我需要传入一个类型:
public ef_generic(string strName, object objEntity)
我需要在LINQ查询中访问这个"ObjEntity",即:
db.objEntity.Where (e => e.id = = myId)当代(). name>
后,我想使用objEntity的类型定义一个私有类型,到目前为止,我有: private List<object> _myRecords;
public List<object> myRecords
{
所以我想在一个显式的实体框架类型传递到一个通用类中使用,我问什么是一个好的方法。
许多谢谢。最简单的方法是将类设置为泛型;请将下面的伪代码视为您可以根据自己的喜好进行更改的伪代码,而不是作为样式指南:)
public class ef_generic<T> where T : class, IHaveAnIdAndAName
{
private List<T> _myRecords; // Your internal List
public IEnumerable<T> myRecords {
get { return _myRecords; }
} // Public list getter
private string _result;
public ef_generic(string strName, IQueryable<T> objEntity)
{
const int myId = 4;
_result = objEntity.First(e => e.Id == myId).Name;
//...
}
}
注意,你想要传递的实体类型(这里是TestEntity
)需要一个Id和一个Name用于linq查询,所以它需要承诺使用接口IHaveAnIdAndAName
来实现它;此外,正如Slauma在注释中指出的那样,它还需要有一个类约束。
public interface IHaveAnIdAndAName
{
int Id { get; }
string Name { get; }
}
public class TestEntity : IHaveAnIdAndAName { ...
当您想要实例化类时,从上下文传递给它IQueryable集合而不是类型名称(很难从类型名称猜出是哪个集合,所以另一种方法更容易)
Db db = GetDb();
var test = new ef_generic<TestEntity>("test", db.TestEntities);