0

我正在使用 MVC3、C#、Razor 和 EF 5。

我正在构建一个通用类,它可以在其构造函数中接受不同的实体,即“订单”,所以我的调用代码可能看起来像。我刚刚意识到我只需要传入一个类型名称而不是一个对象实例,所以这会是什么样子:

ef_generic my_ef_generic = new ef_generic("Test",Order)

目前我的 ctor 签名看起来像。这是错误的,因为我需要传入一个类型:

public ef_generic(string strName, object objEntity)

我需要在 LINQ 查询中访问这个“ObjEntity”,即:

db.objEntity.Where(e=>e.id==myId).First().Name

最后我想使用objEntity的类型定义一个私有类型,到目前为止我有:

    private List<object> _myRecords;
    public List<object> myRecords
    {

所以我想将一个显式的实体框架类型传递给一个泛型类以供使用,我想问什么是好的方法。

非常感谢。

4

1 回答 1

3

最简单的就是让你的类成为泛型;请参阅下面的伪代码,您可以根据自己的喜好进行更改,而不是作为样式指南:)

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您要传入的实体类型(此处)需要用于 linq 查询的 Id 和 Name,因此它需要承诺使用接口来实现它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);
于 2013-06-01T11:25:11.683 回答