设置实例中的所有布尔属性

我正在使用一个类,其实例用于管理各种布尔值。


public bool walkable = true;

public bool current = false;

public bool target = false;

public bool selectable = false;

public bool visited = false;

public Tile parent = null;

public int distance = 0;

还有这个重置实用功能,它将所有布尔值设置回 0


public void Reset ()

{

    walkable = false;

    ...

}

而不是写出每个属性,我希望我可以让函数关闭任何可能属于调用它的给定实例的布尔值。


在互联网上闲逛,我一直在寻找反思的东西,但据我所知,这仅在 C# 文档中引用了实际实例(不在类定义中)时才有效:


// Using GetType to obtain type information:  

int i = 42;  

System.Type type = i.GetType();  

System.Console.WriteLine(type);  

是否可以根据属性从实例中关闭布尔值?想做的事是愚蠢的吗?也许我会更好地跟踪字典中的布尔值?


MYYA
浏览 166回答 2
2回答

梵蒂冈之花

您可以通过重新初始化外观后面的实例来支付更少的成本,而不是支付反射成本。public class AllThoseBooleans {    // expose values    public bool walkable => actual.walkable;    public bool current => actual.current;    public bool target => actual.target;    // real values defined here.    private class Actuals {        private bool walkable {get; set;}        private bool current {get; set;}        private bool target {get; set;}    }    private Actuals actual {get; set;} = new Actuals();    // reset all values to default by initialization    public void ResetAll() {        actual = new Actuals();    }}请注意:我没有运行它或测试访问修饰符;您可能需要调整这一点,但该理论认为:你们班布尔可以“拥有”存储可重新初始化太多太多比反射便宜。

万千封印

您可以这样做(这里的 Test 是具有所有布尔值的类):Test test = new Test();FieldInfo[] fields = typeof(Test).GetFields(); // Obtain all fieldsforeach (var field in fields) // Loop through fields{     string name = field.Name; // Get string name     object temp = field.GetValue(test); // Get value     if (temp is bool) // if it is a bool.         field.SetValue(test, false);     Console.WriteLine("name: {0} value: {1}",field.Name, field.GetValue(test));}输入类:public class Test{public bool walkable = true;public bool current = true;public bool target = true;public bool selectable = true;public bool visited = true;public string parent = null;public int distance = 0;}输出:name: walkable value: Falsename: current value: Falsename: target value: Falsename: selectable value: Falsename: visited value: Falsename: parent value: name: distance value: 0
打开App,查看更多内容
随时随地看视频慕课网APP