我在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);