LucaTImp
LucaTImp

Reputation: 13

C# Can't access inherited protected variable from Generic class

First time poster...

New to C# and Generics and I have been experimenting by creating a simple series of Object Tables for read-only data entries. On my Generic Insert routine I increment a static Id variable to ensure it is always unique. To try and prevent it being modified I set it to protected but the Generic class which then throws a compile error stating that Id can't be accessed.

I am struggling to find out why exactly as I thought "where T : DBEntity" would allow this.

Thanks in advance:

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

Upvotes: 1

Views: 235

Answers (1)

Ranger
Ranger

Reputation: 1174

You're protecting the ID, so you can't set it. It's honestly as simple as that.

Also doing a generic of Table, and tying the generic to a concrete class buys you nothing. Consider an interface instead.

You could fix your issue as the following:

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

Upvotes: 1

Related Questions