我有一个具有通用类型且类型约束为class
的类定义看起来像这样
public class ConnectedRepository<TEntity> where TEntity : class
{
然后我通过以下方法使用它:
public void LoadData<T>() where T:class
{
var GenRep = new ConnectedRepository<T>(c);
grdData.DataSource = GenRep.ToBindingList();
}
我的问题是,我需要在包含该方法的类中的其他地方使用GenRep,因此我需要在此方法之外定义它,但我无法为此找到正确的语法
我需要类似的东西:
ConnectedRepository<??> GenRep;
但找不到正确的类型定义
任何帮助将不胜感激
Code for my repository:
public class ConnectedRepository<TEntity> where TEntity : class
{
internal DbContext _context;
internal DbSet<TEntity> _dbSet;
public ConnectedRepository(DbContext context)
{
_context = context;
_dbSet = context.Set<TEntity>();
}
public IEnumerable<TEntity> ToBindingList()
{
_dbSet.Load();
return _dbSet.Local.ToBindingList();
}
public void SaveChanges()
{
_context.SaveChanges();
}
}
这将从包含gridview的用户控件中使用
public partial class DataView : DevExpress.XtraEditors.XtraUserControl
{
TechnicalServicesContext c = new TechnicalServicesContext();
/// <summary>
///
/// </summary>
public DataView()
{
InitializeComponent();
}
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
public void LoadData<T>() where T:class
{
var GenRep = new ConnectedRepository<T>(c);
grdData.DataSource = GenRep.ToBindingList();
}
public void SaveData()
{
}
}
这是我想用于任何实体的可重复使用的显示
答案 0 :(得分:0)
我不确定您想要的是什么。如果我想对了,您想在周围类的一个对象中的多个位置中使用泛型类型ConnectedRepository的相同实例,并使用相同的基础类型,那么我想说,您需要类依赖于该类,而不仅仅是类的单个方法。
public class ConnectedRepository<TEntity,T>
where TEntity : class
where T:class
{
ConnectedRepository<T> GenRep;
public ConnectedRepository(int c)
{
GenRep = new ConnectedRepository<T>(c); // now sure what c is, bt you could pass it to the constructor like this, if GenRep needs it
}
public void LoadData()
{
grdData.DataSource = GenRep.ToBindingList();
}
public void DoStuff()
{ // do something else with GenRep ?
}
}
答案 1 :(得分:0)
您不应为每种新型数据为存储库创建新实例。对于许多不同的数据类型,它将占用大量内存。 您可以使用带有通用方法的静态类包装器
public static class ConnectedRepository
{
private static DbContext _context;
public static SetContext(DbContext context)
{
_context = context;
}
public static IEnumerable<TEntity> ToBindingList<TEntity>() : where TEntity : class
{
var dbSet = _context.Set<TEntity>();
dbSet.Load()
return dbSet.Local.ToBindingList();
}
}
答案 2 :(得分:0)
将其存储为私有类,例如
private ConnectedRepository<T> _genRep;
进一步看,您是说要类型为T的泛型函数,其中在类头中未提及T吗?那是不允许的。泛型类所操作的所有类型都必须在其标头中声明,并且替换会在编译时发生。