具有类约束的字段

时间:2019-04-01 12:34:06

标签: c# generics

我有一个具有通用类型且类型约束为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()
    {

    }


}

这是我想用于任何实体的可重复使用的显示

3 个答案:

答案 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吗?那是不允许的。泛型类所操作的所有类型都必须在其标头中声明,并且替换会在编译时发生。