Поле возвращает 0, в то время как отладка IDE показывает его с правильным инициализированным значением - PullRequest
1 голос
/ 01 августа 2020

Я использую отражение для создания экземпляров всех классов, производных от ItemPart, следующим образом:

        //Create UI from reflection
    private void DisplayParts(string partGroup)
    {
        List<ItemPart> validParts = GetPartsList(partGroup);
        foreach(ItemPart part in validParts)
        {
            GameObject obj = Instantiate(UIController.ObjectPrefabs[UIController.ObjectPrefabsEnum.ButtonDescription], UI_PartsList.transform);
            DescriptionButton button = obj.GetComponent<DescriptionButton>();
            button.Title.text = part.PartName;
            button.Description.text = part.Description;
            button.ActivateAction = delegate { DesignBench.CreatePart(part); };
        }
    }
    
    //Get classes derived from ItemPart and return a list of instances
    private List<ItemPart> GetPartsList(string partGroup)
    {
        List<Type> types = AppDomain.CurrentDomain.GetAssemblies().SelectMany(s => s.GetTypes()).Where(p => typeof(ItemPart).IsAssignableFrom(p) && p != typeof(ItemPart) ).ToList();

        List<ItemPart> validParts = new List<ItemPart>();

        foreach(Type type in types)
        {
            ItemPart part = (ItemPart)Activator.CreateInstance(type);
            if (part.PartGroup == partGroup)
            {
                validParts.Add(part);
            }
        }
        return validParts;
    }

После доступа к переменным в этом классе я обнаружил, что среда IDE утверждает, что они правильно инициализированные значения, они считываются программой как 0:

public class Handle : ItemPart 
{
//...
        public new PartModifiableStats ModifiableStats = new PartModifiableStats()
        {
            SizeX = new ModifiableStat<float>() { IsEnabled = false, Value = 5 },
            SizeY = new ModifiableStat<float>() { IsEnabled = true, Value = 20, Bounds = new Vector2(10, 150) },
            Material = new ModifiableStat<Materials.Material>() { IsEnabled = true, Value = Materials.MaterialDict[Materials.MaterialTypes.Iron] }
        };
//...
}

https://puu.sh/GcS8h/9a3c26de2b.png https://puu.sh/GcS8L/4911fbd3d8.png

Предположительно, Activator. CreateInstance (type) использует пустой конструктор типа, который, если я не ошибаюсь, должен также правильно инициализировать все переменные в создаваемом типе. Почему это значение по-прежнему равно нулю и почему существует несоответствие между тем, что программа читает, и тем, что IDE считает значением?

        public struct ModifiableStat<T>
        {
            public bool IsEnabled;
            public T Value;
            public Vector2 Bounds;
        }
        public struct PartModifiableStats
        {
            public ModifiableStat<float> SizeX;
            public ModifiableStat<float> SizeY;
            public ModifiableStat<Materials.Material> Material;
        }

1 Ответ

2 голосов
/ 01 августа 2020

Это потому, что вы не переопределяете PartModifiableStats, вы создаете новое свойство / поле в дочернем классе. Оба значения инициализируются, и к ним можно получить доступ через cast .

Возьмите этот бессмысленный пример, чтобы точно увидеть, что происходит

public class Parent
{
   public int Value { get; set; }= 10;
}

public class Child : Parent
{
   public  int Value { get; set; } = 20;
}

...

var part = new Child();

Console.WriteLine("Child Value = " + part.Value);
Console.WriteLine("Parent Value = " + ((Parent)part).Value);

((Parent)part).Value = 25;
  
Console.WriteLine("Child Value = " + part.Value);
Console.WriteLine("Parent Value = " + ((Parent)part).Value);

Выход

Child Value = 20
Parent Value = 10
Child Value = 20
Parent Value = 25

То, что вам, вероятно, нужно, будет примерно таким. Если значение переопределяется и то же значение сохраняется с приведением

public class Parent
{
   public virtual int Value { get; set; }= 10;
}

public class Child : Parent
{
   public override int Value { get; set; } = 20;
}

Выход

Child Value = 20
Parent Value = 20
Child Value = 25
Parent Value = 25
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...