[英]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.