Nano Hash - криптовалюты, майнинг, программирование

Вывести значение свойства List‹› объекта C#

У меня есть тип объекта, например:

Class
{
  public string Variable {get; set;}
  public List<AnotherClass> ListVariable {get; set;}
}

AnotherClass
{
  public string Variable {get; set;}
  public int IntVariable {get; set;}
}

Я пробовал несколько решений (ObjectDumper, object.GetProperties) для вывода всех значений объекта Class на экран; Проблема заключается в невозможности распечатать List<AnotherClass>. Вместо всех его элементов я получаю только его свойство count.

Пробные решения:

Как рекурсивно распечатать значения свойства объекта с использованием отражения

Рекурсивное получение свойств и дочерних свойств объекта

Поиск всех свойств и подсвойств объекта

и еще несколько..

РЕДАКТИРОВАТЬ:

Хорошо, как я вижу, я, вероятно, плохо описал проблему. Мне нужно напечатать все свойства объекта и их значения, когда я не знаю тип объекта и его свойства. Перечисленные решения работают нормально, если объект содержит только простые свойства. Проблема возникает, если одним из свойств является List‹>

Я попробовал следующее:

1)

private static void PrintObject(Object dataSource)
{
   foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(dataSource))
   {
      string name = descriptor.Name;
      object value = descriptor.GetValue(dataSource);

      RichTextBox.Text += name + ": " + value + "\n";

      PrintObject(control, value);
   }
}

Выдает мне результат:

Состояние проверки: выполнено

TextData: System.Collections.Generic.List`1[TextDataField]

Вместимость: 16

Количество: 15

но я ожидал здесь всех 15 значений элементов, а не только количества в списке.

2)

RichTextBox.Text = dataSource.DumpToString(); 

из http://objectdumper.codeplex.com/

Выдает примерно такой же результат.


  • Покажите код, где вы его печатаете. 14.06.2013
  • foreach(var listItem in listVariable)?.. или вы имели в виду GetFields 14.06.2013
  • Этот вопрос вполне подходит. Но скажу вам, это уже обсуждалось (может быть причиной отрицательных голосов). См. любой из вопросов stackoverflow. com/questions/852181/, stackoverflow.com/questions/360277/, stackoverflow.com/questions/1347375/c-sharp-object-dumper. Все ответы там также заботятся о типах коллекций. Если вы пробовали их, но у вас все еще есть проблема, опубликуйте, что вы пробовали, и класс, и где возникла проблема, и что произошло. 14.06.2013
  • Я знаю, что это было ... Но почему-то решения, которые я пробовал, не работали для меня, когда объект содержит List‹otherObjects›. 14.06.2013
  • это поля или свойства? 14.06.2013
  • общедоступные свойства с геттерами и сеттерами. Извините, что не упомянул об этом в вопросе. 14.06.2013
  • @insomnium_ они не работают, потому что эти библиотеки для этого не предназначены. Те, которые вы использовали, дают ожидаемый результат. Они не относятся к типам коллекций специально. Но хорошая новость в том, что есть много других, которые помогут вам здесь. Вы должны пойти на такую ​​​​библиотеку (во всех трех ссылках, которые я вам дал, есть такие классы). См. пример: stackoverflow.com/a/10478008/661933. Или этот stackoverflow.com/a/3514115/661933 или stackoverflow.com/a/1347630/661933 14.06.2013

Ответы:


1

"дамперные" методы - это самый простой и самый правильный способ сделать это, когда вы контролируете источник классов, которые хотите просмотреть. Кроме того, это самый безопасный метод, потому что вы можете сбрасывать не-public данные, не допуская при этом прямого доступа к ним посторонних.

Самый простой способ добиться этого — переопределить метод ToString(), который Object предоставляет любому типу. Таким образом, ваш код будет чистым и читаемым.

Вы также можете сделать это через System.Reflection, но это будет сложнее и не даст дополнительных преимуществ. ПОЦЕЛУЙ здесь ключевое слово.

Вот так (проверено в LINQPad): ПРИМЕЧАНИЕ public слова должны писаться с заглавной буквы, например: public int Variable

void Main()
{
    Class myClassObj = new Class();
    myClassObj.Variable = 1;
    myClassObj.ListVariable = new List<AnotherClass>();
    myClassObj.ListVariable.Add(new AnotherClass{ Variable="some", IntVariable=2 });

    Console.WriteLine(myClassObj.ToString());
}

public class Class
{
    public int Variable{get;set;}
    public List<AnotherClass> ListVariable {get;set;}

    public override string ToString()
    {
        return string.Join(", ", new string[]{ 
            string.Format("Variable= {0}", + this.Variable),
            string.Format("ListVariable= [{0}]", string.Join(", ", this.ListVariable))
        });
    }
}

public class AnotherClass
{
    public string Variable{get;set;}
    public int IntVariable{get;set;}

    public override string ToString()
    {
        return string.Join(", ", new string[]{
            string.Format("Variable={0}", this.Variable),
            string.Format("IntVariable={0}", this.IntVariable)
        });
    }
}
14.06.2013
  • На самом деле у меня есть масса возможных классов типов объектов. Те, что я перечислил, являются лишь примером, поэтому это решение требует написания большого количества кода. Спасибо, в любом случае! 14.06.2013

  • 2

    Если вы не знаете тип объекта и его свойства, дайте классу (AnotherClass) собственный метод для печати:

    public Class
    {
        public string variable;
        public List<AnotherClass> listVariable;
    
        public void Print()
        {
            foreach(var item in listVariable)
            {
               // ...or how you what to print?
               Console.WriteLine(item.GetString());
            }
        }
    }
    
    public AnotherClass
    {
        public string variable;
        public int intVariable;
    
        public string GetString()
        {
            // Format here your output.
            return String.Format("Var: {0}, IntVar: {1}", this.variable, this.intVariable);
        }
    }
    
    14.06.2013


    4

    Я думаю, это может помочь вам.

    Class A
        {
          public string variable;
          public List<B> listVariable;
        }
    
    Class B
        {
          public string variable;
          public int intVariable;
        }
    
    A obj = new A();  
    //obj.listVariable[index].variable;
    //obj.listVariable[index].intVariable;
    
    14.06.2013
  • Это должно быть ответом на вопрос? Конкретно этот? 12.04.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..