Получить поле и тип свойства класса рекурсивно - PullRequest
0 голосов
/ 22 ноября 2018

Предположим, у меня есть такой класс:

public class Class1 {
    public int x1;
    public Class2 x2;
    public double x3;
}

public class Class2 {
    public int y1;
    private int x2;
}

Есть какой-либо способ получить всю информацию о типе всех сериализуемых членов (я думаю, что это все открытые поля и свойства без явногозаявление приватному члену) из Class1?

Например, я хочу создать такое дерево типов:

<Class1>
    <x1>int</x1>
    <x2>Class2</x2>
        <Class2>
            <y1>int</y1>
        </Class2>
    <x3>double</x3>
 </Class1>

Дерево будет расширяться, если этот член не является атомарным типом (как int, double, List и все типы, определенные системой).

Моя идея

Я знаю, что могу использовать reflection и deep first search, чтобы сделать это.Но я обнаружил, что все может стать сложным, потому что класс может быть generic class.И меня беспокоит, есть ли более сложная ситуация, чем generic class.

Так есть ли лучшее решение, чем использование reflection и deep first search для создания этого дерева?

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Я полагаю, что FormatterServices.GetSerializableMembers вернет всех сериализуемых членов , как вы изначально задали в своем вопросе.

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

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

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

Если я вас правильно понимаю, вы хотите защитить от сериализации.Я бы пришел к этому под другим углом.

  1. Украсьте свои классы интерфейсами для обеспечения контракта.
  2. И / order поместите ваши классы / интерфейсы в библиотеку классов, где они находятсяменее вероятно, что это будет бампер, или даже сделать шаг вперед и уничтожить их.
  3. Если вы действительно беспокоитесь о проблемах сериализации, используйте сериализатор на основе контракта, такой как DataContracts, который ломается, если изменяется, и может иметь версию.

Обновление

  1. пользователям принадлежат классы, которые необходимо сериализовать.

  2. Я использовал XmlSerializer для его сериализации и десериализации.

  3. Проблема, которую я хочу решить:

    • Сначала пользователь определил Class1, как указано выше, и он развернут как на машине A, так и на машине B.
    • Затем пользователи добавили открытое поле x в Class1, развертывание машины A происходит быстрее, чем B., поэтому машина A распознала недавно добавленный x.Но развертывание машины B происходит медленнее, поэтому машина B не знает x, тогда сериализация для машины B. будет прервана.
    • Так что теперь я хочу убедиться, что больше никаких изменений классов, переданных моему сериализатору, больше нет.

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

...