Я внес некоторые правки в ваш вопрос - надеюсь, я вас правильно понял.
Если вы хотите экспортировать данные
Если ваш вопрос действительно касается отображения данных, то есть более эффективные способы сделать это, чем создать собственный метод экспорта. Формат, который вы пытаетесь отобразить, похож на YAML. Там также JSON и XML. Использование одной из этих библиотек, вероятно, лучше, чем написание собственного метода:
Если вы хотите узнать больше об отражении
Может быть, вам интересно узнать больше об рефлексии, и экспорт - всего лишь пример, чтобы поиграть с ним. В этом случае, давайте посмотрим на эту строку:
Console.WriteLine($"{item.Name}: {item.GetValue(listReg[i], null)}");
$"{item.GetValue(listReg[i], null)}"
в конечном итоге вызывает person1.Phones.ToString()
. Поведение по умолчанию ToString
просто отображает имя типа. Вы можете изменить это поведение, например так:
class Phones : List<Phone>
{
public override string ToString()
{
return Program.DynamicExportToString(this);
// ... where DynamicExportToString is a modified version of DynamicExport that
// builds and returns a string rather than sending it directly to the Console.
}
}
Возможно, вы хотите иметь возможность обрабатывать любой класс , даже если вы не можете переопределить ToString
во всех классах, которые вы можете экспортировать. Тогда вам нужно будет добавить дополнительную логику в метод DynamicExport
, потому что ...
$"{item.Name}: {item.GetValue(listReg[i], null)}"
... не работает для каждой ситуации. Нам нужно отображать разные вещи в зависимости от типа собственности.
- Подумайте, как вы хотите обрабатывать нулевые значения. Может быть, что-то вроде
$"{item.Name}: <null>"
- Используйте существующий код
$"..."
, если тип ...
- a тип примитива .
DateTime
String
- ... или
Nullable<>
одного из этих типов.
- Если тип реализует
IEnumerable
, переберите содержимое коллекции и рекурсивно вызовите код экспорта для каждого элемента.
- Важно проверить этот интерфейс после вы проверили, является ли тип
String
, потому что String
реализует IEnumerable
.
- В противном случае рекурсивно вызовите ваш код экспорта для этого значения.
Когда вы вызываете свой код экспорта рекурсивно, было бы разумно защититься от бесконечных циклов. Если объект, который вы пытаетесь экспортировать, содержит круговую ссылку - вы можете быстро получить StackOverflowException
. Чтобы избежать этого, сохраняйте стопку объектов, которые уже были посещены.
Я думаю, что приведенный выше совет обычно применим всякий раз, когда вы используете отражение для обхода графа объектов - будь то для сериализации или для каких-либо других целей.
Надеюсь, это поможет!