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?
答案 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)
您的设计不起作用。
您有两个选择:
答案 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);
}