Итерация словаря интерфейсов как определенного типа - PullRequest
0 голосов
/ 25 июня 2019

У меня есть словарь класса string / interface. Я не могу включить нужные мне поля в дочерние классы интерфейса, но у каждого из них есть те же общедоступные переменные, которые мне нужно изменить.

Я хочу пройтись по словарю и изменить их на значения внутри класса цикла. Я не могу этого сделать, так как интерфейс не содержит этих переменных.

Как мне поступить об этом?

public class MakeAbility : MonoBehaviour
{
public BlockScriptableObject block;

public IDictionary<string, IAbility> abilities_parts = new Dictionary<string, IAbility>();


public Targeting target_manager;

public AbAttack attack;
public AbCast cast;
public AbDefend defend;
public AbDefendOther defend_other;
public AbPotion potion;

private void Start()
{
    abilities_parts.Add("attack", attack);
    abilities_parts.Add("cast", cast);
    abilities_parts.Add("defend", defend);
    abilities_parts.Add("defend_other", defend_other);
    abilities_parts.Add("potion", potion);
}

public void trigger_button()
{
    foreach (var i in abilities_parts.Values)
    {
        i.block_attack_damage = block.attack_damage;
        i.targeting_for_attack = target_manager;
    }



public interface IAbility
{
void Use();
void Enact();
}

public class AbPotion : MonoBehaviour, IAbility
{
public Targeting targeting_for_attack;
public int block_attack_damage = 10;

public void Use()
{

}

public void Enact()
{

}

}

1 Ответ

0 голосов
/ 25 июня 2019

Ваши свойства НЕ являются свойствами IAbility.Они являются свойствами класса AbPotion.Вам понадобится оператор if else для типов, чтобы установить их индивидуально.Дело в том, что они должны быть установлены до добавления в Dictionary и, вероятно, через конструктор.

public void trigger_button()
{
    foreach (var i in abilities_parts.Values)
    {
        if(i is AbPotion)
        {
            var potion = i as AbPotion;

            potion.block_attack_damage = block.attack_damage;
            potion.targeting_for_attack = target_manager;
        }
        else if(i is AbAttack)
        {
            var attack = i as AbAttack;

            attack.Property1= value1;
            attack.Property2 = value2;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...