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

时间:2018-09-09 11:22:21

标签: c#

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

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;

还有此Reset实用程序功能,它将所有布尔值都设置回0

public void Reset ()
{
    walkable = false;
    ...
}

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

在Internet上闲逛,我不断地思考着东西,但据我所读,这仅在引用了实际实例(不在类定义中)from the C# docs的情况下有效:

// Using GetType to obtain type information:  
int i = 42;  
System.Type type = i.GetType();  
System.Console.WriteLine(type);  

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

2 个答案:

答案 0 :(得分:3)

您可以通过在门面后面重新初始化实例来支付小得多的费用,而不是支付反射的费用。

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();
    }
}

请注意:我没有运行此程序或测试访问修饰符;您可能需要对其进行调整,但这个概念仍然成立:您的布尔值类可以“拥有一个”商店,该商店可以比反射便宜很多的时间来重新初始化。

答案 1 :(得分:1)

您可以执行此操作(这里的Test是包含所有布尔值的类):

Test test = new Test();

FieldInfo[] fields = typeof(Test).GetFields(); // Obtain all fields
foreach (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: False
name: current value: False
name: target value: False
name: selectable value: False
name: visited value: False
name: parent value: 
name: distance value: 0