繁体   English   中英

实例扩展方法? C#

[英]Instanced extension methods? C#

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

如果您了解扩展方法,则以下内容应该很熟悉。

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

public static List<Member> GetMemberList(this GameObject go)
{
    return memberList;
}

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

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

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

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

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

public static List<Member> GetMemberList(this GameObject go) {
  return memberLists[go];
}

看来你正在使用Unity3。 UnityAnswers网站上有一个相关的答案可能有所帮助: http ://answers.unity3d.com/questions/22493/unity-3-sealed-class-gameobject-.html

似乎应该有办法使用内置脚本系统附加您想要的Unity框架中固有的行为。

是的,你是对的。 如果您有静态方法,则该类的所有实例共享相同的数据。 调用return memberList; 是非法的。 它与return this.memberList;相同return this.memberList; this在静态方法中不可用。 相反,你必须调用该类: return GameObject.memberList; 但我知道你不是在寻找这个解决方案。

扩展方法旨在创建其他行为 如果要创建其他数据 ,则使用继承扩展GameObject类是正确的选择。

或者,您可以使用Dictionary<GameObject, List<Member>>形式的Dictionary<GameObject, List<Member>>附加memberList。 但我个人赞成如下所示的作文:

public class myGameObject
{
    public List<Member> memberList { get; set; }
    public GameObject go { get; set; }
}
private static ConditionalWeakTable<GameObject, List<Member>> dict = new ConditionalWeakTable<GameObject, List<Member>>();

public static List<Member> GetMemberList(this GameObject go)
{
  return dict.GetOrCreateValue(go);
}

ConditionalWeakTable管理对象生存期,因为它使用弱引用。 因此,如果没有其他实时引用,它不会阻止GC收集GameObject ,这也将允许收集List<Member>

它是线程安全的,但是这假设你希望你的起始点是一个空列表(如果没有当前值,则在GetOrCreateValue调用默认构造函数)。 如果您想要一个不同的起点,您的线程问题会变得更加复杂。

扩展方法只是“看起来”像实例方法的静态方法。

但是,它们不会添加静态方法所没有的任何附加功能,它只是为了易用性,维护和可读性。 扩展方法也无法访问受保护/私有成员。

如果GameObject实际上没有密封(即它没有sealed关键字),那么您可以编写一个继承GameObject的类来访问其受保护的方法/字段/属性。 这只有在您自己构建这些对象的情况下才有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM