使用反射将 class 中的每个变量加在一起

Adding each variables in the class together using reflection

有没有办法使用反射添加每个变量?例如,手动的做法是:

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)))
}

首先,你最好保持原样,因为反射比正常访问慢得多,将它包含在运算符中是个坏主意,因为它们可能用于循环等,但是如果你想要达到类似的效果,请执行以下操作:

使用字典看你的字段都是浮点数,然后你可以添加一个方法到

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;
}

您的 class 可能有一组默认字段,您可以添加这些字段。

+ 运算符方法将遍历字典键并对两个对象的值求和。

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; }
}