在类内部,我有以下结构

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>[]的集合,因为它需要一个不可为null的类型参数,并且我也不能从where子句中删除该结构,因为ComponentDataArrayStateGroup也需要一个结构!

除了编写我为每个StateGroup对象手动调用多次的方法外,是否有任何合理的方法将这些方法添加到集合中并为每个元素调用该特定方法?

最佳答案

您可以在没有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);

09-29 21:55