创建通用类a运行时

时间:2017-09-05 13:05:53

标签: c# entity-framework generics dry

我在DAL程序集中有两个泛型类,它们都是只读存储库。

较低级别的模型实体存储库(MER)与DBContext(模型优先)及其中的模型实体进行交互。更高级别的公共实体存储库(CER)的任务是将模型实体转换为公共实体并将行为公开给BAL程序集。

我不希望将模型实体暴露给BAL,因此我在CER中创建了一个映射来定义公共实体映射到模型实体的内容。使用这个映射,我尝试在CER内部创建MER的实例,但我必须提供泛型类型,但我很挣扎。

  

映射代码

            Mapping = new Dictionary<Type, Type>
        {
            { typeof(IPostPurcahseOrderProperties), typeof(PostedPurchaseOrder) },
            { typeof(IPostPurchaseOrderReceiptsProperties), typeof(PostedPurchaseOrdersReceipt) },
            { typeof(IPostSaleOrdersProperties), typeof(PostedSaleOrder) },
            { typeof(IPostPlacementsProperties), typeof(PostedPlacement) }
        };
  

实例化代码

var M = Mapping[typeof(E)];
var bob = new ModelRepository<M>(new ProteinEntities());
  

编译器返回的问题

M是一个变量但是像类型一样使用

请帮忙!

  

块引用

MER代码(根据要求)

using System;
using System.Collections.Generic;
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Linq.Expressions;
using Protein.Interfaces;

namespace Protein
{
    public class ModelRepository<M> : IModelRepositoryReadOnly<M>
        where M : class
    {
#region "fields"
        private ObjectContext objContext;
        private ObjectSet<M> objectSet;
        private IDictionary<Type, Type> mapping;
        #endregion

#region "constructors"
        public ModelRepository(IObjectContextAdapter context)
        {
            objContext = context.ObjectContext;
            objectSet = objContext.CreateObjectSet<M>();
        }
#endregion

#region "behaviours"
        public IQueryable<M> Find(Expression<Func<M, bool>> predicate)
        {
            return objectSet.Where(predicate);
        }

        public IEnumerable<M> GetAll()
        {
            return objectSet.ToList();
        }
#endregion
    }
}
  

测试代码(根据评论中的第一个网络链接)

var typeOfClass = typeof(DoSomething<>);
var typeOfArguement = typeof(Bob);
var constructedClass = typeOfClass.MakeGenericType(typeOfArguement);

var created = Activator.CreateInstance(constructedClass);

0 个答案:

没有答案