Можно ли каким-то образом создать коллекцию объектов Foo <T>, где T ограничен ненулевым типом? - PullRequest
0 голосов
/ 08 сентября 2018

Внутри класса у меня есть следующая структура

private struct StateGroup<TState> where TState : struct, IAgentState
{
    // ...
    // ComponentDataArray requires TState to be a struct as well!
    public ComponentDataArray<TState> AgentStates;
    // ...
}

и несколько объектов этого типа

[Inject] private StateGroup<Foo> _fooGroup;
[Inject] private StateGroup<Bar> _barGroup;
[Inject] private StateGroup<Baz> _bazGroup;
// ...

с атрибутом Inject, отмечающим цель для автоматического внедрения зависимости.

Внутри класса мне нужно вызывать один и тот же кусок кода для каждого StateGroup объекта, и я хочу добавить все в коллекцию и выполнить итерации по ней. Однако я не могу определить любую коллекцию типа StateGroup<IAgentState>[], так как для нее требуется необязательный параметр типа , и я не должен удалять структуру из предложения where , поскольку ComponentDataArray из StateGroup требует структуру как хорошо!

Помимо написания метода, который я вручную вызываю дюжину раз для каждого StateGroup объекта, есть ли разумный способ добавить их в коллекцию и вызвать этот конкретный метод для каждого элемента?

1 Ответ

0 голосов
/ 09 сентября 2018

Вы можете создать другой интерфейс для StateGroup<TState> без ограничения struct:

private interface IStateGroup<TState> where TState : IAgentState { }

Затем мы создаем StateGroup для реализации нового интерфейса:

private struct StateGroup<TState>: IStateGroup<IAgentState> where TState: struct, IAgentState { }

И тестирование:

var states = new List<IStateGroup<IAgentState>>();
var fooGroup = new StateGroup<Foo>();
var booGroup = new StateGroup<Boo>();
var mooGroup = new StateGroup<Moo>();
states.Add(fooGroup);
states.Add(booGroup);
states.Add(mooGroup);
...