第一次海报......
C#和Generics的新手,我一直在尝试为只读数据条目创建一系列简单的对象表。 在我的Generic Insert例程中,我增加一个静态Id变量以确保它始终是唯一的。为了尝试防止它被修改我将它设置为受保护但是Generic类然后抛出编译错误,指出无法访问Id。
我正在努力找出为什么与我的想法完全一致"其中T:DBEntity"会允许的。
提前致谢:
public class DBEntity
{
public int Id { get; protected set; }
}
public class Table<T> where T : DBEntity
{
static int _id = 0;
private readonly List<T> _set = new List<T>();
public IEnumerable<T> Set() { return _set; }
public void Insert(T item)
{
_id++;
item.Id = _id; //when set to protected it is inaccessible
_set.Add(item);
}
}
答案 0 :(得分:1)
您正在保护ID,因此您无法设置它。说实话,这很简单。
同时做一个Table的泛型,并将泛型绑定到一个具体的类,什么都不买。改为考虑一个界面。
您可以按以下方式解决问题:
public interface IDatabaseItem
{
int? Id { get; }
SetID(int value);
}
public class DBEntity : IDatabaseItem
{
public int? Id { get; private set; }
public void SetID(int value)
{
if (Id == null)
{
Id = value;
}
else
{
throw new Exception("Cannot set assigned Id; can only set Id when it is not assgined.");
}
}
}
public class Table<T> where T : IDatabaseItem
{
static int _id = 0;
private readonly List<T> _set = new List<T>();
public IEnumerable<T> Set() { return _set; }
public void Insert(T item)
{
if (item.Id == null)
{
_id++;
item.SetID(_id);
_set.Add(item);
}
else
{
//Handle this case. Something else set the ID, yet you're trying to insert it. This would, with your code, imply a bug.
}
}
}