Создание общего списка только для чтения из производного класса

Использовать классы символов.

^([0-9A-Za-z -]+)(,[0-9A-Za-z -]+)*$

Обратите внимание, что \w содержит символы подчеркивания, поэтому я расширяю его до буквенно-цифровых диапазонов.

Благодаря @Jay для указания отсутствующие якоря.

0
задан Fanus du Toit 5 March 2019 в 22:01
поделиться

1 ответ

Следующий код, который вы написали, создает копию вашего списка во время его создания - поэтому он всегда пуст, независимо от того, что вы добавляете в список позже.

List<object> managedArray = new List<object>();
ArrayReferences.Add(typeof(T), managedArray);
return Array.AsReadOnly(managedArray.Select(s => (T)s).ToArray());

Вот как вы должны написать свой код, чтобы получить то, что вы хотите:

public static void Main()
{
    Derived d = new Derived();
    Console.WriteLine(d.AsReadOnly().Count);
    d.AddElement(new GenericObject { i = 2 });
    Console.WriteLine(d.AsReadOnly().Count);
}

public class Base<T>
{
    List<T> _items = new List<T>();

    public ReadOnlyCollection<T> AsReadOnly()
    {
        return Array.AsReadOnly(_items.ToArray());
    }

    public void AddElement(T obj)
    {
        _items.Add(obj);
    }

    public void RemoveElement(T obj)
    {
        _items.Remove(obj);
    }
}

public class Derived : Base<GenericObject>
{
}

public class GenericObject
{
    public int i = 0;
}

Что выводит:

0
1

Теперь стоит учесть, что List<T> уже есть метод AsReadOnly(), так что вы можете просто написать это:

public static void Main()
{
    var d = new List<GenericObject>();
    Console.WriteLine(d.AsReadOnly().Count);
    d.Add(new GenericObject { i = 2 });
    Console.WriteLine(d.AsReadOnly().Count);
}

public class GenericObject
{
    public int i = 0;
}

Это тоже работает.


Вот как вы должны сделать это, чтобы хранить более одного списка одновременно. Нет необходимости в наследовании.

public static void Main()
{
    Repository r = new Repository();
    Console.WriteLine(r.AsReadOnly<GenericObject>().Count);
    r.AddElement<GenericObject>(new GenericObject { i = 2 });
    Console.WriteLine(r.AsReadOnly<GenericObject>().Count);
}

public class Repository
{
    private Dictionary<Type, object> _references = new Dictionary<Type, object>();

    private void Ensure<T>()
    {
        if (!_references.ContainsKey(typeof(T)))
        {
            _references[typeof(T)] = new List<T>();
        }
    }

    public ReadOnlyCollection<T> AsReadOnly<T>()
    {
        this.Ensure<T>();
        return (_references[typeof(T)] as List<T>).AsReadOnly();
    }

    public void AddElement<T>(T obj)
    {
        this.Ensure<T>();
        (_references[typeof(T)] as List<T>).Add(obj);
    }

    public void RemoveElement<T>(T obj)
    {
        this.Ensure<T>();
        (_references[typeof(T)] as List<T>).Remove(obj);
    }
}

public class GenericObject
{
    public int i = 0;
}
0
ответ дан Enigmativity 5 March 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: