public record SomethingHappenedEvent(Guid Id, object TheThing, string WhatHappened)
{
public SomethingHappenedEvent(object theThing, string whatHappened)
: this(Guid.NewGuid(), theThing, whatHappened)
{ }
}
< /code>
Как и следовало ожидать, они сериализуются и отправляются в другом месте для обработки. Отправители звонят в конструктор с двумя аргументами и получают новый идентификатор, но Deserializer должен использовать «первичный» конструктор 3-аргумента, подразумеваемый записным объявлением.
Я использую Newtonsoft json.net, и я уверен, что это сработало: < /p>
var record = new SomethingHappenedEvent("roof", "caught fire");
var json = JsonConvert.SerializeObject(record);
var otherSideRecord = JsonConvert.DeserializeObject(json);
Assert.AreEqual(record, otherSideRecord);
< /code>
Конечно, это не так. Это бросает JsonerializationException. Он не может найти правильный конструктор, потому что их два, а также конструктор по умолчанию по умолчанию, и не отмечен JSONConstructOratrattribute.
Мой вопрос действительно: «Какие варианты у меня есть для получения чего-то подобного?». Это было бы здорово: < /p>
[JsonConstructor]
public record SomethingHappenedEvent(Guid Id, object TheThing, string WhatHappened)
{
public SomethingHappenedEvent(object theThing, string whatHappened)
: this(Guid.NewGuid(), theThing, whatHappened)
{ }
}
< /code>
Но это пытается применить атрибут к типу, который является недействительным.
, и это синтаксическая ошибка в C#, хотя, очевидно, работает в F#. < /p>
public record SomethingHappenedEvent
[JsonConstructor]
(Guid Id, object TheThing, string WhatHappened)
{
public SomethingHappenedEvent(object theThing, string whatHappened)
: this(Guid.NewGuid(), theThing, whatHappened)
{ }
}
< /code>
Мое текущее решение состоит в том, чтобы оставить эти типы в качестве простых классов и жить со всеми дополнительными шаблонами. Я также знаю, что могу опустить пользовательский конструктор и заставить моих абонентов генерировать идентификаторы. Это работает, потому что есть только один конструктор для json.net, чтобы найти. Это конечно Но я не люблю повторять код на всех сайтах вызовов, даже если он маленький в этом случае. < /P>
public record SomethingHappenedEvent(Guid Id, object TheThing, string WhatHappened) { }
fwiw это звучит как system.text.json имеет одинаковое ограничение.
Использование C# 9 на .net 5.0, у меня есть куча типов записей, например: < /p> [code]public record SomethingHappenedEvent(Guid Id, object TheThing, string WhatHappened) { public SomethingHappenedEvent(object theThing, string whatHappened) : this(Guid.NewGuid(), theThing, whatHappened) { } } < /code> Как и следовало ожидать, они сериализуются и отправляются в другом месте для обработки. Отправители звонят в конструктор с двумя аргументами и получают новый идентификатор, но Deserializer должен использовать «первичный» конструктор 3-аргумента, подразумеваемый записным объявлением. Я использую Newtonsoft json.net, и я уверен, что это сработало: < /p> var record = new SomethingHappenedEvent("roof", "caught fire"); var json = JsonConvert.SerializeObject(record); var otherSideRecord = JsonConvert.DeserializeObject(json); Assert.AreEqual(record, otherSideRecord); < /code> Конечно, это не так. Это бросает JsonerializationException. Он не может найти правильный конструктор, потому что их два, а также конструктор по умолчанию по умолчанию, и не отмечен JSONConstructOratrattribute. Мой вопрос действительно: «Какие варианты у меня есть для получения чего-то подобного?». Это было бы здорово: < /p> [JsonConstructor] public record SomethingHappenedEvent(Guid Id, object TheThing, string WhatHappened) { public SomethingHappenedEvent(object theThing, string whatHappened) : this(Guid.NewGuid(), theThing, whatHappened) { } } < /code> Но это пытается применить атрибут к типу, который является недействительным. , и это синтаксическая ошибка в C#, хотя, очевидно, работает в F#. < /p> public record SomethingHappenedEvent [JsonConstructor] (Guid Id, object TheThing, string WhatHappened) { public SomethingHappenedEvent(object theThing, string whatHappened) : this(Guid.NewGuid(), theThing, whatHappened) { } } < /code> Мое текущее решение состоит в том, чтобы оставить эти типы в качестве простых классов и жить со всеми дополнительными шаблонами. Я также знаю, что могу опустить пользовательский конструктор и заставить моих абонентов генерировать идентификаторы. Это работает, потому что есть только один конструктор для json.net, чтобы найти. Это конечно Но я не люблю повторять код на всех сайтах вызовов, даже если он маленький в этом случае. < /P> public record SomethingHappenedEvent(Guid Id, object TheThing, string WhatHappened) { } [/code] fwiw это звучит как system.text.json имеет одинаковое ограничение.