C # Перебрать и установить все поля в структуре - PullRequest
2 голосов
/ 22 ноября 2011
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 ]

5 голосов
/ 22 ноября 2011

Установить все в 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;

Вы могли бы также подумать о том, чтобы сделать более чистую оболочку для этой сторонней библиотеки, таким образом изолируя ваш код от этой довольно уродливой структуры.

3 голосов
/ 22 ноября 2011

Вы уверены, что моделирование / представление правильно?То, что у вас есть, выглядит не совсем правильно.

Учтите это:

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 голосов
/ 22 ноября 2011

По умолчанию логические значения имеют значение false.

Вы можете перебирать свойства с отражением, но это будет не очень быстро, но, возможно, приемлемо для вас.

Но, возможно, подумайте об этом.Если у вас есть объект с некоторыми свойствами, установленными в true, и вы хотите сбросить их в false, просто создайте новый объект.

1 голос
/ 22 ноября 2011

Вы можете использовать Type.GetFields() или Type.GetProperties(), используя Reflection, чтобы получить значения, и SetValue, чтобы установить значения.

Но почему вы не используете класс для этого?Вы абсолютно уверены, что вам нужна структура?

0 голосов
/ 22 ноября 2011

с отражением:

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);
}
0 голосов
/ 22 ноября 2011

Ваш дизайн не будет работать.

  • При создании структуры все значения по умолчанию устанавливаются как ложные.
  • После создания структуры значения не могут быть изменены

У вас есть 2 варианта:

  • Изменить на класс
  • Создать новую структуру, когда вам нужно сбросить значения
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...