2014-05-16 12 views
0

我正在尋找一些建議如何應對類似的例子處理問題時避免重複的工作:諸多變數

string A; 
string B; 
string C; 
string D; 
... 

void Initialize() 
{ 
    A = someObject.A.ToString(); 
    B = someObject.B.ToString(); 
    C = someObject.C.ToString("F"); 
    D = someObject.D.ToString(); 
    ... 
} 

我班有很多數字變量的,我需要他們的價值觀傳遞給這些很容易爲大量這樣的變量串。假設這是基於角色扮演遊戲的統計數據,並且很多統計數據,因素等在這裏扮演角色。通過複製粘貼來管理這樣多的變量是一種痛苦。

問題:我怎樣才能簡化大量變量的工作。
我想知道這個問題的一些解決方案,因爲我沒有任何經驗,我不知道任何人或任何來源來搜索解決方案。

我個人認爲使用某種結構,字典或數據庫。

編輯:準確地說,我創建了一個名爲Character的類,它有很多xp,life,gold等屬性。現在我想使用名爲Label的類在屏幕上繪製文本,所以我編寫了包含Label對象的GUI類,這些對象在各種事件上都會作出相應的反應比如我需要在一開始分配給我的標籤指定文本,如:

Label life, gold, xp, etc; 
life.text = Character.instance.Life.ToString(); 
gold.text = Character.instance.Gold.ToString(); 
xp.text = Character.instance.XP.ToString(); 
... 
+0

「automatize」是什麼意思? – adv12

+0

如果沒有真正重複的行爲(要在循環中建模),那麼您幾乎陷入了所擁有的狀態。 – BradleyDotNET

+0

你看過依賴注入嗎? – Tdorno

回答

0

你應該在這個問題更多的細節,你究竟想要達到的。

根據您提供的信息,我假設您想要動態讀取someObject的屬性,對它們執行ToString()並將其值賦給一些變量。這是一個典型的反思任務。你可能想讀a chapter covering reflection on MSDN

如果上述假設是正確的,你可以做到以下幾點:

 Dictionary<string, string> propertyValues = new Dictionary<string, string>(); 

     // We access the type information via reflection. What properties your someObject has? 
     PropertyInfo[] propertyInfos = someObject.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public); 

     foreach (var propertyInfo in propertyInfos) 
     { 
      // we get the value of the property, described by propertyInfo, from our someObject 
      object value = propertyInfo.GetValue(someObject, null); 
      if (value != null) 
      { 
       // do your special type handling here and execute ToString() 
       if(value.GetType() == typeof(int)) 
        propertyValues[propertyInfo.Name] = ((int)value).ToString("F"); 
       if(value.GetType() == ...) 
       else 
        propertyValues[propertyInfo.Name] = value.ToString(); 
      } 
     } 

     // so if your someObject had a property A you can access it as follows: 
     string A = propertyValues["A"]; 

     // or you loop the dictionary and do some suff with it (which makes much more sense): 
     foreach(var keyValuePair in propertyValues) 
      Console.WriteLine("Property {0} = {1}", keyValuePair.Key, keyValuePair.Value); 
+2

我不會低估這一點,但我認爲在不知道OP的要求的情況下將反思作爲一種解決方案提出可能是非常具有誤導性的。幾乎肯定有更好的基於設計的解決方案。 –

0

這一點很難讓我們沒有看到你的精確設計/要求說,但一個簡單的方法要做到這一點,處理很多情況是存儲對象本身,而不是複製它的屬性或字段。

例如,在你的版本,你可能有:

private int A; 
private string B; 
private double C; 

public void Initialize(DataObject data) 
{ 
    A = data.A; 
    B = data.B; 
    C = data.C; 
} 

public void DoSomething() //Just an arbitrary method using the data 
{ 
    return B + " " + A.ToString(); 
} 

然而,你可以更簡單地做:

private DataObject _data; 

public void Initialize(DataObject data) 
{ 
    _data = data; 
} 

public void DoSomething() //Just an arbitrary method using the data 
{ 
    return _data.B + " " + _data.A.ToString(); 
} 
0

根據值是如何進入「someObject」,第一步有更少的代碼將是定義屬性爲字符串,在get訪問器方法中從int到String的轉換。儘管這只是將ToString()移動到不同的位置,但每次獲取該值時都會減少代碼。

+0

通常你不必經常調用'ToString'。對於大多數設計,只存儲原始值比'ToString'版本更簡單 –

+0

我仍然將它們作爲int存儲在內部,並簡單地在get accessor方法上執行ToString()。另一個(醜陋的)選項是將它們存儲爲int並使用兩種不同訪問方法的Java-ish方法:一個用於int,另一個用於String。 – ke4ktz