У меня возникли проблемы с отображением элементов из. список.
У меня есть класс Doc
, в котором есть Item
s. Затем я добавляю TextField в Item, но затем, когда я пытаюсь его получить, я получаю только пространство имен. У меня нет никаких свойств в результате, связанных с textField
, таких как текст и т. д. Только связанные с классом элемента.
Можете ли вы посоветовать, что я делаю неправильно? Я вижу textFormField
в результате при отладке, но я не знаю, как получить к нему доступ?!
public class Doc
{
public List<Item> Items { get; set; }
}
public class Item
{
public string ID { get; set; }
public Input Input { get; set; }
}
public Result<Doc, ErrorCodes> ReturnDataSample()
{
var finalResult = new Result<Doc, Error>();
Doc doc = new Doc();
doc.Items = new List<Item>();
TextFormField textFormField = new TextFormField();
textFormField.Text = "TEST";
textFormField.PageIndex = 1;
doc.Items.Add(textFormField);
finalResult.Result = doc;
return finalResult;
}
Фильтрация данных
class Program
{
static void Main(string[] args)
{
var t = new Test();
var data = t.ReturnDataSample();
Console.WriteLine(data.Result.Items.Count);
Console.WriteLine(data.Result.SourceProvider.ItemsRawData);
var test = new TextFormField();
foreach (var item in data.Result.Items)
{
Console.WriteLine(item);
}
}
}
Пожалуйста, включите определение TextFormField
Также определение Input
.
Вы должны переопределить метод «ToString» в классе «Item». См. https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/how-to-override-the-tostring-method
Реализации метода Object.ToString по умолчанию возвращают полное имя типа объекта.
https://learn.microsoft.com/en-us/dotnet/api/system.object.tostring?view=net-5.0
Console.WriteLine(item); => Console.WriteLine(item.ToString());
item.ToString() возвращает имя класса. Добавьте метод, который возвращает желаемый результат, в класс Item и вызовите его в WriteLine. Вместо этого вы также можете переопределить ToString() класса Item.
Пара моментов здесь. Item
необходимо переопределить метод .ToString()
, чтобы иметь встроенный способ преобразования объекта в строку.
Кроме того, список элементов в Doc
должен быть инициализирован в конструкторе, а свойство должно быть доступно только для чтения.
что-то вроде этого:
public class Doc
{
public Doc() { Items = new List<Item>(); }
public List<Item> Items { get; }
public int Count => Items.Count;
public void Add(string id, Input input)
=> Items.Add(new Item() { ID=id, Input=input });
}
public class Item
{
public string ID { get; set; }
public Input Input { get; set; }
public override string ToString() => $"ID = {ID}, Input = {Input}";
}
и вышеизложенное можно использовать как
class Program
{
static void Main(string[] args)
{
var doc = new Doc();
doc.Add("1001", new Input(...));
doc.Add("1002", new Input(...));
foreach (var item in doc.Items)
{
Console.WriteLine(item);
}
}
}
Было бы лучше иметь
doc.Items = new List<Item>();
внутри конструктора дляDoc
. Таким образом, значениеdoc.Items
никогда не бывает нулевым. И сделайте свойствоItems
доступным только для чтения.