实例扩展方法?C#

Mic*_*r3D 2 c# extension-methods

所以我想为api创建一个扩展方法,api已经密封了.

如果您了解扩展方法,以下应该看起来很熟悉.

private static List<Member> memberList = new List<Member>();

public static List<Member> GetMemberList(this GameObject go)
{
    return memberList;
}
Run Code Online (Sandbox Code Playgroud)

请注意,要声明扩展方法,它需要是静态的,并且因为它需要是静态的,所以我通过GameObject类型访问的List必须是静态的.我希望每个GameObject都有自己的成员列表.但是我很确定,因为这是一个静态字段,每个实例GameObject都会指向相同的静态memberList.

我的假设是真的吗?如果是这样,可能会有什么替代方案?我想避免将GameObject放在也包含memberList的包装类中,因为api只允许在运行时检测和操作GameObjects.有一些方法可以通过gameObject反向引用包装类,但这会增加我希望避免的代码的复杂性.

Guf*_*ffa 6

是的,如果你想在游戏对象之外保留一些东西并通过扩展方法访问它,它必须是静态的.

您可以使用字典将一个成员列表映射到每个游戏对象:

private static Dictionary<GameObject, List<Member>> memberLists = new Dictionary<GameObject, List<Member>>();

public static List<Member> GetMemberList(this GameObject go) {
  return memberLists[go];
}
Run Code Online (Sandbox Code Playgroud)

  • +1虽然我以为我会提到 - 如果你这样做,请小心,因为静态字典会保留列表中的所有项目,以及GC可以访问的GameObject实例,因此它们永远不会得到GCed.如果使用这种方法,请确保您的`GameObject`实例正确删除,否则您可能会遇到内存问题. (4认同)