(C# VB) Могу ли я динамически изменять значения всех переменных в классе? - PullRequest
0 голосов
/ 06 августа 2020

Я видел способы перечислить все переменные в определенном классе, но есть ли способ установить их значения ? Мне нужен метод, который я могу вызвать, и он может сбрасывать значения всех переменных на false / 0, я знаю, что могу вручную установить их на false / 0, но любое изменение их значений все испортит, и я просто вижу есть ли что-нибудь еще динамическое c / простой способ сделать это? Сейчас делаю следующее:

// These are just some of the vars that are here.
Error = false;
double GUM = 0, MUM = 0;
decimal Mass = 0, GAcc = 0, Fg = 0, FµsRes = 0, FµkRes = 0, Fµs = FµsNS.Value, Fµk = FµkNS.Value;

1 Ответ

0 голосов
/ 06 августа 2020

Как уже упоминалось, вы можете использовать Reflection, чтобы установить для всех полей класса значения по умолчанию:

using System;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var myClass = new MyClass();
            myClass.Error = true;
            myClass.GUM = 1;
            myClass.MUM = 2;
            myClass.Mass = 3.5m;
            myClass.GAcc = 4.5m;
            myClass.Fg = 5.5m;

            ResetFields(myClass);

            // All fields are reseted
        }

        public static void ResetFields(object source)
        {
            foreach (var fieldInfo in source.GetType().GetFields() )
            {
                fieldInfo.SetValue(source, GetDefault(fieldInfo.FieldType) );
            }
        }

        public static object GetDefault(Type type)
        {
            if (type.IsValueType)
            {
                return Activator.CreateInstance(type);
            }

            return null;
        }
    }

    public class MyClass
    {
        public bool Error = false;

        public double GUM = 0, MUM = 0;

        public decimal Mass = 0, GAcc = 0, Fg = 0;

        //etc etc
    }
}

Однако лучший подход - создать класс только для хранения значений и повторного при необходимости создайте его:

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var myClass = new MyClass();
            myClass.Variables = new MyVariables();
            myClass.Variables.Error = true;
            myClass.Variables.GUM = 1;
            myClass.Variables.MUM = 2;
            myClass.Variables.Mass = 3.5m;
            myClass.Variables.GAcc = 4.5m;
            myClass.Variables.Fg = 5.5m;

            myClass.Variables = new MyVariables();

            // All fields are reseted
        }
    }

    public class MyVariables
    {
        public bool Error = false;

        public double GUM = 0, MUM = 0;

        public decimal Mass = 0, GAcc = 0, Fg = 0;
    }

    public class MyClass
    {
        public MyVariables Variables;

        // etc etc

        public int Xyz
        {
            get { return Variables.GUM + Variables.MUM; } // Use calculated properties
        }
    }
}

Метод GetDefault показан в этом ответе .

...