簡體   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