C#无法从Generic类访问继承的受保护变量

时间:2016-03-05 23:53:54

标签: c# generics inheritance

第一次海报......

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

1 个答案:

答案 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.
        }
    }
}