2016-05-28 35 views
0

我有對象的兩個列表如何分配到引用的對象

[Serializable] 
private class MemorySet 
{ 
    public Dictionary<string, object> _Map; 
    public List<object> _Results; 
    public List<object> _Storage; 
} 
MemorySet Memory = new MemorySet(); 

我可以有分配爲對象鍵,例如

_Map.Add("someKey", _Results[_Results.Count - 1]); 

我有一個方法

private object Mapper(string key) 
{ 
    if (Memory._Map.ContainsKey(key)) 
    { 
     return Memory._Map[key]; 
    } 
    else if (key.ToLower() == "result") 
    { 
     return Memory._Results[Memory._Results.Count - 1]; 
    } 
    else if (key.ToLower() == "storage") 
    { 
     return Memory._Storage[Memory._Storage.Count - 1]; 
    } 
    else if (key.ToLower().Contains("result")) 
    { 
     int n = Convert.ToInt32(key.ToLower().Split(new string[] { "result" }, StringSplitOptions.None)[1]); 
     return Memory._Results[n]; 
    } 
    else if (key.ToLower().Contains("storage")) 
    { 
     int n = Convert.ToInt32(key.ToLower().Split(new string[] { "storage" }, StringSplitOptions.None)[1]); 
     return Memory._Storage[n]; 
    } 
    else return null; 
} 

現在我必須分配給_Storage或_Results那樣的對象:

object obj = key != "" ? Mapper(key) : Memory._Storage[Memory._Storage.Count - 1]; 
if(obj is string) obj as string = "test"; 

這會改變obj引用內存中的一些新字符串。但是我想改變obj引用的對象。

換句話說,obj將成爲「測試」,但底層對象不會被改變。

我明白爲什麼會發生這種情況,雖然在編寫整個引擎時我並沒有想到它,現在我對這個問題有很大的困擾。在C++中,我們有指針,但在C#中,我不想使用GCHandles或非託管代碼來處理那些微不足道的事情,這會非常難看。

那麼,如何分配給對象指向的對象,而不是分配給對象本身呢?

+0

我不知道你想在這裏做什麼,但我會告訴你,你」重新正確:指針指針在C#中不舒服。這就是說,我知道這並不意味着什麼,但我從來沒有遇到過這個問題。我可能會後退一步,質疑這是否是解決這個問題的正確方法。它看起來很複雜並且容易出錯,但這只是我的看法。也許強迫這些不同的操作變成單一模糊的方法並不是構建這種方法的最佳方式。 –

+0

用幾句話來說,我有方法可以在這裏或那裏分配,而且我需要一個方法來告訴根據某些條件分配哪裏。問題是,我無法傳遞這樣的對象 – JDE

+0

您的命名約定非常不規範。通常公共屬性或字段只是以大寫字母開頭。私有屬性或字段以下劃線和小寫字母開頭。它不是什麼大不了的事情,而只是你可能沒有意識到的東西。 – bodangly

回答

0

試試這個

[Serializable] 
    private class MemorySet 
    { 
     public Dictionary<string, object> _Map = new Dictionary<string,object>(); 
     public List<object> _Results = new List<object>(); 
     public List<object> _Storage = new List<object>)_; 
    } 
+0

你是什麼意思? – JDE

+0

字典和List <>需要在添加數據之前調用構造函數(帶有new)。您正在嘗試在調用構造函數之前添加數據。 – jdweng

+0

我在別的地方那樣做,但是會引用空引用,很明顯,你不覺得 – JDE

0

如果你不想惹你目前的設計,你可以只添加將更新在同一模板作爲Mapper方法你的數據結構的方法。這是它會是什麼樣子:

private void Update(string key, object value) 
{ 
    if (Memory._Map.ContainsKey(key)) 
    { 
    Memory._Map[key] = value; 
    } 
    else if (key.ToLower() == "result") 
    { 
    Memory._Results[Memory._Results.Count - 1] = value; 
    } 
    else if (key.ToLower() == "storage") 
    { 
    Memory._Storage[Memory._Storage.Count - 1] = value; 
    } 
    else if (key.ToLower().Contains("result")) 
    { 
    int n = Convert.ToInt32(key.ToLower().Split(new string[] { "result" }, StringSplitOptions.None)[1]); 
    Memory._Results[n] = value; 
    } 
    else if (key.ToLower().Contains("storage")) 
    { 
    int n = Convert.ToInt32(key.ToLower().Split(new string[] { "storage" }, StringSplitOptions.None)[1]); 
    Memory._Storage[n] = value; 
    } 
    else 
    { 
    throw new ArgumentException("Failed to compute valid mapping", nameof(key)); 
    } 
} 

也許你也可以在裏面添加key == ""模式,我不知道要了解如何做到這一點正是使用,但希望你的想法。

編輯:好的,所以在不同的結構中使用同一個對象的引用。你應該考慮設計一個避免這個問題的MemorySet。如果您仍然認爲這是考慮您的需求的恰當設計,那麼您有一個簡單的解決方案:將目標對象包裹在其他對象中。

public class ObjectWrapper 
{ 
    public object ObjectOfInterest { get; set; } 
} 

現在你存儲ObjectWrapper對象。然後,你可以更新屬性ObjectOfInterest而且這種變化會反映到包含所有結構此ObjectWrapper

ObjectWrapper wrapper = Mapper(key); 
wrapper.ObjectOfInterest = "test"; 
+0

這不會工作,因爲Memory._Map [key] = value;會在字典中設置相應的對象,而不是列表中的那個 – JDE

+0

@JDE夠公平,請參閱我更新的答案。 –