为这个虚假问题道歉。这个问题与泛型或C#完全无关,只是......我的智商。
刚刚发生了什么:
我的数据容器是一个静态成员变量,在getter函数中它应该是:
get
{
if (_Data == null)
{
_Data = new DataStore();
return _Data;
}
return _Data;
}
我写道:
get
{
if (_Data == null)
{
return new DataStore();
}
return _Data;
}
因此,每次从外部获取Data.XXXDataSet
时,它始终返回new Data()
,因此其中的每个XXXDataSet
都为空。
感谢您的帮助......我现在应该删除这个问题吗?
=======原始问题======
问题描述:
我想编写一个通用方法来将一些数据库条目加载到内存(用于编辑器),过程是这样的:
using (var db = new MyDbContext())
{
db.Configuration.AutoDetectChangesEnabled = false;
var list = new List<MyDataEntity>((from d in db.MyDataEntity select d).Count());
foreach (var c in (from d in db.MyDataEntity select d).AsNoTracking())
list.Add(c);
Data.MyDataStore = new ObservableCollection<MyDataEntity>(list);
}
这很好用,我写的相应通用方法是:
public static ObservableCollection<T> LoadDBEntries<T>() where T : class
{
using (var db = new MyDbContext())
{
db.Configuration.AutoDetectChangesEnabled = false;
var dbSet = db.Set<T>();
var list = new List<T>((from d in dbSet select d).Count());
foreach (var c in (from d in dbSet select d).AsNoTracking())
list.Add(c);
return new ObservableCollection<T>(list);
}
}
此方法正确运行(看起来如此),列表将填充db数据(可观察集合也是如此),但正如我所写:
Data.MyDataStore = DBWorker.LoadDBEntries<MyDataEntity>();
Data.MyDataStore
在执行后仍为空(原始状态)。
我试着这样做:
// I know the ref for coll is unnecessary but...
public static void LoadDBEntries<T>(ref ObservableCollection<T> coll) where T : class
{
using (var db = new MyDbContext())
{
db.Configuration.AutoDetectChangesEnabled = false;
var dbSet = db.Set<T>();
var list = new List<T>((from d in dbSet select d).Count());
foreach (var c in (from d in dbSet select d).AsNoTracking())
list.Add(c);
coll = new ObservableCollection<T>(list);
}
}
然后运行:
DBWorker.LoadDBEntries(ref Data.MyDataStore);
结果相同(Data.MyDataStore
为null),但是从调试器中它告诉数据已正确加载到&#39; coll'(以我理解的方式,这是{{1}变量,没有?)。但是,在此方法超出范围后,Data.MyDataStore
仍为空。
有人能告诉我为什么会这样吗?我是否误解了C#中的泛型(我对此完全是一个菜鸟)或者更根本的是,C#本身?
非常感谢!