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();
}

我希望你能理解我的问题,并能帮助我。

非常感谢!

很抱歉写了这么长一篇文章,对于所有的观众来说,这是一个土豆…不是开玩笑,这是认真的。

c#动态泛型实例

您试过这样做吗:

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关键字,并观察存储在变量categoriesusers中的内容。

更新3:

基于小提琴-我把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泛型。