2015-07-19 28 views
1

有沒有方法使用反射來添加每個變量?舉例來說,這樣做的手工方式是:使用反射將類中的每個變量加在一起

public class PlayerStats { 
    public float Health; 
    public float HealthRegen; 
    public float Mana; 
    public float ManaRegen; 
    public float Stamina; 
    public float StaminaRegen; 
    public float Armor; 
    public float AttackDamage; 
    public float AttackDamageCritical; 
    public float AttaackSpeed; 
    public float AttackRange; 
    public float MovementSpeed; 

    public static PlayerStats operator +(PlayerStats ps1, PlayerStats ps2){ 
     PlayerStats returnPlayerStats = new PlayerStats(); 
     returnPlayerStats.Health = ps1.Health + ps2.Health; 
     returnPlayerStats.HealthRegen = ps1.HealthRegen + ps2.HealthRegen; 
     returnPlayerStats.Mana = ps1.Mana + ps2.Mana; 
     returnPlayerStats.ManaRegen = ps1.ManaRegen + ps2.ManaRegen; 
     returnPlayerStats.Stamina = ps1.Stamina + ps2.Stamina; 
     returnPlayerStats.StaminaRegen = ps1.StaminaRegen + ps2.StaminaRegen; 
     returnPlayerStats.Armor = ps1.Armor + ps2.Armor; 
      returnPlayerStats.AttackDamage = ps1.AttackDamage + ps2.AttackDamage; 
     returnPlayerStats.AttackDamageCritical = ps1.AttackDamageCritical + ps2.AttackDamageCritical; 
     returnPlayerStats.AttaackSpeed = ps1.AttaackSpeed + ps2.AttaackSpeed; 
     returnPlayerStats.Health = ps1.AttackRange + ps2.AttackRange; 
     returnPlayerStats.Health = ps1.MovementSpeed + ps2.MovementSpeed; 
     return returnPlayerStats; 
    } 
} 

所以我想我可以通過使用反射自動化這個?也許是這樣的:

foreach(var field in typeof(PlayerStats).getFields()){ 
    field.setValue((object)((int)field.getValue(ps1) + (int)field.getValue(ps2))) 
} 
+3

你會被推動實際運行時工作到代碼只是爲了避免一些打字。如果這對你來說很痛苦,你可以寫一些T4模板來爲你生成。 –

+1

您可以進一步推送,並使用表達式樹在運行時生成代碼,但僅在第一次調用方法之前生成代碼。這值得麼?我不這麼認爲。 – MarcinJuraszek

回答

1

首先你最好還是離開它,它是這樣的,因爲反射比正常的訪問慢得多,而且它是一個糟糕的主意,包括它的運營商,因爲他們可能在使用循環等,但如果你想達到類似的效果請執行下列操作:

使用字典看到,因爲你的領域都是浮筒,那麼你可以添加一個方法來

private Dictionary<string,float> fields = new Dictionary<string,float>() 

public PlayerStats() 
{ 
    fields.Add("Health", value); 
    // other fields here 
} 

public void SetField(string name, float value) 
{ 
    if(!fields.ContainsKey(name)) 
     throw new InvalidOperationException("Field doesnt exists"); 
    fields[name] = value; 
} 

你的類可以有可以添加到的默認字段集。

+運算符方法將遍歷字典鍵並對兩個對象的值進行求和。

public static PlayerStats operator +(PlayerStats ps1, PlayerStats ps2){ 
    var playerstats = new PlayerStats(); 
    foreach(var key in fields.keys) 
    { 
     playerstats[key] = ps1[key] + ps2[key]; 
    } 
    return playerstats; 
} 

您可以添加強類型訪問者的作爲屬性

public float Health 
{ 
    get { return fields["Health"]; } 
    set { field["Health"] = value; } 
} 
相關問題