C#循环并设置结构中的所有字段

时间:2011-11-21 21:24:51

标签: c# data-structures types

public struct Speakers 
{
    //...

    public bool BackCenter { get; set; }
    public bool BackLeft { get; set; }
    public bool BackRight { get; set; }
    public bool FrontCenter { get; set; }
    public bool FrontLeft { get; set; }
    public bool FrontLeftOfCenter { get; set; }
    public bool FrontRight { get; set; }
    public bool FrontRightOfCenter { get; set; }
    public bool SideLeft { get; set; }
    public bool SideRight { get; set; }
    public bool Subwoofer { get; set; }
    public bool TopBackCenter { get; set; }
    public bool TopBackLeft { get; set; }
    public bool TopBackRight { get; set; }
    public bool TopCenter { get; set; }
    public bool TopFrontCenter { get; set; }
    public bool TopFrontLeft { get; set; }
    public bool TopFrontRight { get; set; }

}

如何轻松遍历所有这些并将其设置为false?

6 个答案:

答案 0 :(得分:5)

将all设置为false相对简单,因为default(T)new T()将所有这些设置为false。所以你只需要将默认值分配给你感兴趣的变量。

speakers=default(Speakers);

如果你需要一个非默认值,你可以使用反射,但它有点难看,因为拳击将隐式复制你的值。要将所有值设置为true,您可以:

Speakers speakers = new Speakers();
object boxedSpeakers = speakers;
foreach(PropertyInfo p in sp.GetType().GetProperties())
    p.SetValue(boxedSpeakers, true, null);
speakers = (Speakers)boxedSpeakers;

您还可以考虑在第三方库上创建一个更清晰的包装器,从而将您的代码与这个相当丑陋的结构隔离开来。

答案 1 :(得分:3)

您确定建模/表示是否正确?你有什么看起来不太正确。

考虑一下:

class Speaker
{
    // not really relevant here
    public SpeakerPosition Position {get; set;}  //enum        

    public void PowerOff() { ... }
}

然后你就这样使用它:

class SpeakerSystem
{
    Speaker[] _speakers = ...;

    public void PowerOff()
    {
        foreach(var speaker in _speakers)
           speaker.PowerOff();
    }
}

答案 2 :(得分:2)

默认情况下,布尔值是假的。

您可以使用反射迭代属性,但这不会很快,但可能对您而言可以接受。

但也许想一想。如果对象的某些属性设置为true,并希望将它们重置为false,则只需创建新对象。

答案 3 :(得分:1)

您可以使用Type.GetFields()Type.GetProperties()使用反射来获取值,并使用SetValue来设置值。

但是,为什么你不使用课程?你绝对确定你需要一个结构吗?

答案 4 :(得分:0)

您的设计不起作用。

  • 创建结构时,所有值都默认设置为false。
  • 创建结构后,无法更改值

您有两个选择:

  • 更改为课程
  • 需要重置值时创建新结构

答案 5 :(得分:0)

反思:

object a = new Speakers(); // required boxing, otherwise you cannot change a struct
PropertyInfo[] info = a.GetType().GetProperties();
for (int i = 0; i < info.Length; i++)
{                
    info[i].SetValue(a, false, null);
}