Как использовать generi c Queue, где тип также имеет параметр generi c? - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть ситуация, когда я хотел бы иметь свойство члена в моем классе, которое использует обобщенный c Queue<T>, предоставленный. Net, однако, мой тип также является generi c.

Например:

Я хочу объявить, что мой класс со свойством member является экземпляром Queue;

public class SomeServiceThing: Singleton<SomeServiceThing>
{
    private Queue<SomeType<T>> = new Queue<SomeType<T>>();

    ....

    private void EnqueueEvent<T>(SomeType<T> _event)
    {
        pendingEvents.Enqueue(_event);
        lastEventQueued = DateTime.Now;
    }

    private void Update()
    {
        if (someConditionIsMet)
        {
            // flush the queue and perform an operation with each pending event
        }
    }
}

Полученная ошибка компилятора: «Не удается разрешить символ« T »» , что имеет смысл, поскольку T не может быть получен при создании экземпляра класса, но тогда я хотел бы спросить, как бы вы go об использовании Queue таким образом, когда сам T имеет обобщенный c параметр?

Ответы [ 4 ]

2 голосов
/ 26 февраля 2020

Вы должны изменить класс SomeServiceThing на SomeServiceThing<T>

public class SomeServiceThing<T> : Singleton<SomeServiceThing<T>>
{
    private Queue<SomeType<T>> pendingEvents = new Queue<SomeType<T>>();

    private void EnqueueEvent(SomeType<T> _event)
    {
        pendingEvents.Enqueue(_event);
        lastEventQueued = DateTime.Now;
    }

    private void Update()
    {
        if (someConditionIsMet)
        {
            // flush the queue and perform an operation with each pending event
        }
    }
}

0 голосов
/ 26 февраля 2020

Если вам нужен один SomeServiceThing вместо одного SomeServiceThing для типа T, заставьте ваш generi c SomeType<T> реализовать интерфейс и использовать этот интерфейс в качестве типа T для очереди.

public class SomeServiceThing: Singleton<SomeServiceThing>
{
    private Queue<ISomeType> = new Queue<ISomeType>();

    ....

    private void EnqueueEvent<T>(ISomeType _event)
    {

А затем определите SomeType как:

public class SomeType<T>: ISomeType
{
0 голосов
/ 26 февраля 2020
public class SomeServiceThing<T>: Singleton<SomeServiceThing>
{
    private Queue<SomeType<T>> = new Queue<SomeType<T>>();

....

    private void EnqueueEvent(SomeType<T> _event)
    {
        pendingEvents.Enqueue(_event);
        lastEventQueued = DateTime.Now;
    }

    private void Update()
    {
        if (someConditionIsMet)
        {
        // flush the queue and perform an operation with each pending event
        }
    }
}
0 голосов
/ 26 февраля 2020

Если вы используете T в своей очереди, вы должны определить его уже на уровне класса, а не на уровне метода:

public class SomeServiceThing<T>: Singleton<SomeServiceThing<T>>
{
    private Queue<SomeType<T>> = new Queue<SomeType<T>>();

    ....

    private void EnqueueEvent(SomeType<T> _event)
    {
        pendingEvents.Enqueue(_event);
        lastEventQueued = DateTime.Now;
    }

    private void Update()
    {
        if (someConditionIsMet)
        {
            // flush the queue and perform an operation with each pending event
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...