Skip to content

Comments

Медников Матвей#239

Open
easyThingsLover wants to merge 2 commits intokontur-courses:masterfrom
easyThingsLover:master
Open

Медников Матвей#239
easyThingsLover wants to merge 2 commits intokontur-courses:masterfrom
easyThingsLover:master

Conversation

@easyThingsLover
Copy link

No description provided.

var result = config.PrintToString(group);

result.Should().Contain("Name = LEADER:Leader");
result.Should().Contain("Name = LEADER:Alice");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Странный тест. Ты здесь настраиваешь сериализацию лидера g.Leader.Name, при этом тест ожидает, что сериализация настроится не только у лидера, но и простых членов. Тест вводит в заблуждение, работать так не должно

return new BaseContext<TOwner, T>(this);
}

public IPropertyPrinterConfigContext<TOwner, T> For<T>(Expression<Func<TOwner, T>> propertySelector)
Copy link

@OvchinnikovNikita OvchinnikovNikita Nov 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нам нужно выполнить настройку конкретного свойства, но у тебя здесь свойство настраивается глобально (см. комментарий к тесту: мы настроили сериализацию Name у лидера, но она встала и для обычных членов - как раз по этой причине). Нужно уметь разделять свойства с одинаковым именем, но разными "путями" - чтобы настройки Name для лидера и для членов не пересекались. Сейчас ты в propertySerializers хранишь просто "Name" - попробуй реализовать хранение c полными путями: "Leader.Name", "Members.Name" - это позволит развести настройки

var sb = new StringBuilder();
sb.AppendLine(type.Name);

foreach (var propertyInfo in type.GetProperties())

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Ты смотришь только на GetProperties, а как же GetFields?
  2. Используй BindingFlags.Public | BindingFlags.Instance


}

private string PrintEnumerable(IEnumerable enumerable, Type type, int nestingLevel, HashSet<object> visited)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да, словарь реализует IEnumerable<KeyValuePair<TKey, TValue>>, но мы хотим получить для словарей крассивый аккуратный вывод, например:

Dictionary`2
	Key = User1, Value = 10
	Key = User2, Value = 5

Давай на это будем ориентироваться, сейчас у тебя словари сериализуются не очень хорошо: большой уровень вложенности и плохая читаемость, нужно поправить

{
return type.Name + " circular dependency" + Environment.NewLine;
}
return obj + Environment.NewLine;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Небезопасно. Ты сделал защиту от циклических зависимостей для коллекций, а вот обычные типы могут зациклиться на этом моменте: здесь вызывается obj.ToString, который может быть переопределен и будет обращаться к свойствам объекта, что вызовет сериализацию. Я бы просто тут кидал фиксированную заглушку в обоих случаях

…бавил красивую сериализацию словаря, сделал проверку на цикличность безопастной
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants