c#动态泛型实例
本文关键字:实例 泛型 动态 | 更新日期: 2023-09-27 18:09:57
这是我的第一个问题,我不是很熟悉c#术语,所以如果我弄混了一些术语或定义,我提前道歉。
我已经建立了一个通用的EF数据访问层;
public class BaseService<TObject> where TObject : class
{
private DbContext Context;
private static readonly Lazy<BaseService<TObject>> lazy = new Lazy<BaseService<TObject>>(() => new BaseService<TObject>());
public static BaseService<TObject> Instance => lazy.Value;
public BaseService()
{
Context = new evEntities();
}
public BaseService(DbContext context)
{
Context = context;
}
public ICollection<TObject> GetAll()
{
return Context.Set<TObject>().ToList();
}
public async Task<ICollection<TObject>> GetAllAsync()
{
return await Context.Set<TObject>().ToListAsync();
}
public TObject Get(int id)
{
return Context.Set<TObject>().Find(id);
}
}
with this;
public static class DA
{
public static DataAccess.Categories Categories => new DataAccess.Categories();
public static DataAccess.Tags Tags => new DataAccess.Tags();
public static DataAccess.Users Users => new DataAccess.Users();
}
public static class DA<T> where T : class
{
public static BaseService<T> Base => new BaseService<T>();
}
在我的业务层我可以这样做;
public class Categories
{
public Categories() { }
public ICollection<Database.Categories> GetAll()
{
return DA.Categories.GetAll().ToList();
}
public async Task<ICollection<Database.Categories>> GetAllAsync()
{
return await DA.Categories.GetAllAsync();
}
public Database.Categories Get(int id)
{
return DA.Categories.Get(id);
}
}
清晰。我的EF创建类/实体,如"数据库"。类别"answers"数据库"。用户',我传递作为'对象'到我的BaseService,以获得从我的所有实体数据库中提取数据的标准方式。
现在我的问题是。以类似的方式,我想创建一个通用的业务层。;public class BusinessLogicBase<TModel>
{
public ICollection<TDBModel> GetAll()
{
return null;
}
public async Task<ICollection<TDBModel>> GetAllAsync()
{
return await DA.Categories.GetAllAsync();
}
public TDBModel Get(int id)
{
return DA.Categories.Get(id);
}
}
我希望能够调用DA与一个对象,如数据库。类别,但这必须是动态的,基于传递给BusinessLogicBase的类型。所以我想做这样的事情(这不起作用);
private ???? DetermineDatabaseModel()
{
switch(typeof(TModell))
{
case Models.Categories:
return Database.Categories;
case Models.Users:
return Database.Users;
}
}
所以我可以这样做;
public ICollection<TDBModel> GetAll()
{
var databaseModel = DetermineDatabaseModel()
return DA<databaseModel>().GetAll();
}
我希望你能理解我的问题,并能帮助我。
非常感谢!
很抱歉写了这么长一篇文章,对于所有的观众来说,这是一个土豆…不是开玩笑,这是认真的。
您试过这样做吗:
public class BusinessLogicBase<TDBModel> where TDBModel : class {
public ICollection<TDBModel> GetAll() {
return DA<TDBModel>.Base.GetAll();
}
}
更新1:如果您尝试先不使用泛型编写它,然后使用泛型将其转换为更通用的模式,可能会对您有所帮助。如果没有泛型,有些错误更容易解决。
方法public ICollection<TDBModel> GetAll()
不能返回ICollection<TDBModel>
,因为类型参数TDBModel
在类签名和方法签名中都没有定义。如果你这样定义它会更有意义:
public class BusinessLogicBase<TModel>
{
public ICollection<TModel> GetAll()
{
return null;
}
}
更新2:尝试这个简单的控制台应用程序来演示dynamic
关键字,并观察存储在变量categories
和users
中的内容。
基于小提琴-我把IBaseService<dynamic>
改为dynamic
:
public class BL<TModel>
{
// This is what i want to make dynamic.
// how do i create a return type that i can use in DA<>..
private Type testDetermineDatabaseModel()
{
switch(typeof(TModel).Name){
case "Categories":
return typeof(Database.Categories);
case "Users":
return typeof(Database.Users);
}
return null;
}
public ICollection<TModel> testGetAll()
{
var databaseModel = testDetermineDatabaseModel();
// return DA<databaseModel>().Base.GetAll();
return new List<TModel>();
}
// NEW
// I have constructed the following.
private dynamic baseService;
public dynamic DetermineDatabaseModel()
{
switch (typeof(TModel).Name)
{
case "Categories":
return new BaseService<Database.Categories>();
case "Users":
return new BaseService<Database.Users>();
default:
return null;
}
}
private IBaseService<TDbModel> GetBase<TDbModel>() where TDbModel : class
{
return new BaseService<TDbModel>();
}
public ICollection<TModel> GetAll()
{
ICollection<TModel> returnValue = new List<TModel>();
// This works!!!
foreach (var item in GetBase<Database.Categories>().GetAll())
{
returnValue.Add((TModel)(object)item);
}
baseService = DetermineDatabaseModel();
// This doesn't!!! It's the same thing!! :(
foreach (var item in baseService.GetAll())
{
returnValue.Add((TModel)(object)item);
}
return returnValue;
}
}
但请记住,这并不能解决你所面临的问题。这就是map 2泛型。