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

1
public class Zone
{
    public string zoneID { get; set; }
    public string zoneName { get; set; }
    public string zonePID { get; set; }
}

Я хочу использовать foreach для Zone, например

var zone = new Zone(){zoneId = "001", zoneName = "test"};
foreach(var field in zone)
{
   string filedName = field.Key;  //for example : "zoneId"
   string filedValue = filed.value; //for example : "001"
}

Я просто не знаю, как реализовать GetEnumerator() в классе Zone

  • 6
    Чтобы получить хороший ответ, вам, вероятно, следует объяснить, что вы на самом деле пытаетесь достичь. Вы можете реализовать IEnumerable<KeyValuePair<string, string>> без особых проблем (используя рефлексию), но я скептически отношусь к тому, что это был бы хороший способ решить любую вашу большую проблему. Одной из распространенных альтернатив для вашего класса является использование словаря для поддержки имен полей и значений, а затем их перечисление тривиально (поскольку именно это и производит словарь при перечислении). Но в вопросе недостаточно информации, чтобы понять, каков правильный ответ.
  • 2
    Это определенно проблема XY , то есть вы думаете, что это решение A должно решить некоторую проблему B, но вместо того, чтобы просить нас помочь вам с B, вы просите нас помочь вам с решением, которое не работает A.
Теги:
foreach

4 ответа

4

Вы не можете перечислять свойства класса (простым способом)

Используйте строковый массив или список строк или словарь внутри вашего класса.

Примечание. Действительно, можно перечислять свойства класса с помощью Reflection, но это не так, как в вашем случае.

0

Спасибо, эвейрон! Кажется, мне нужно использовать рефлексию для достижения цели.

System.Reflection.PropertyInfo[] pis = zone.GetType().GetProperties();
foreach (var prop in pis)
{
    if (prop.PropertyType.Equals(typeof(string))) 
    {
        string key = prop.Name;
        string value = (string)prop.GetValue(zome, null);
        dict.Add(key, value); //the type of dict is Dictionary<str,str>
    }
}

Просто не знаю, это хорошее решение.

0
foreach(var field in zone)
{
   string filedName = field.zoneID;  //Id of property from Zone Class
   string filedValue = filed.zoneName ; //name of property from Zone Class
}
  • 0
    Привет, хотя это вполне может ответить на вопрос, но учтите, что другие пользователи могут быть не настолько осведомлены, как вы. Почему бы вам не добавить небольшое объяснение, почему этот код работает? Спасибо!
0

Вы можете оснастить Zone этим методом:

public Dictionary<string, string> AsDictionary()
{
  return new Dictionary<string, string>
    {
      { "zoneID", zoneID },
      { "zoneName", zoneName },
      { "zonePid", zonePid },
    };
 }

Тогда вы можете это foreach.

Кроме того, вы можете реализовать GetEnumerator() как блок итератора, где вы yield return три new KeyValuePair<string, string>.

Я не говорю, что этот дизайн особенно рекомендуется.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню