【问题标题】:(C# VB) Could I change all variables' values in a class dynamically?(C# VB) 我可以动态更改类中所有变量的值吗?
【发布时间】:2020-11-26 15:47:43
【问题描述】:

我已经看到了在某个类中列出所有变量的方法,但是有没有办法设置它们的值
我想要一个可以调用的方法,它可以将所有变量的值重置为 false / 0 ,我知道我可以手动将它们设置为 false / 0,但是对其值的任何更改都会搞砸一切,我只是看到如果有什么更动态/更简单的方法可以做到这一点? 目前我正在做以下事情:

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

【问题讨论】:

  • 您目前的方法有什么问题?您可以使用反射 (GetType().GetFields()),但这会很慢。
  • 因为我有很多变量,重置它们会很痛苦,我想探索其他选项。
  • 您见过哪些“列出所有变量”的方法,您是否调查过相同的技术是否可以让您设置它们的值? (我会惊讶地看到允许第一个没有第二个的东西......)
  • 不是说如果你再新建一个类,所有的值都会自动设置为 false/0 吗?所以 classWithVars = new ClassWithVars() 然后它被重置。或者那不是你需要的?
  • 我见过人们使用反射,但他们并没有深入研究设置值,而是列出它们。

标签: c# winforms dynamic


【解决方案1】:

正如其他人所提到的,您可以使用反射将所有类字段设置为其默认值:

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 方法见this answer

【讨论】:

  • 非常感谢。
  • 不客气,先生。如果对您有帮助,请考虑投票和/或接受答案。
猜你喜欢
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多