Я создал оболочку для двух требуемых свойств IoT-устройства на стороне сервера, которая выглядит следующим образом:
public class Desired
{
private readonly Twin twin;
public Desired(Twin twin)
{
this.twin = twin;
}
public Config Config
{
get
{
if (this.twin.Properties.Desired.Contains(ConfigProperty))
{
TwinCollection config = this.twin.Properties.Desired[ConfigProperty];
// read the settings, evaluate, construct config
return result;
}
return null;
}
set
{
var result = new TwinCollection();
result[nameof(Config.Name)] = value.Name;
// Set other stuff
this.twin.Properties.Desired[ConfigProperty] = result;
}
}
}
Это работает очень хорошо для моих целей за одним исключением. Если я прочитаю двойника из концентратора IoT, оберну его в Desired и запишу свойство Config (когда его еще нет в структуре JSON на стороне концентратора IoT, т.е. записываю его в первый раз), тогда я не смогу прочитайте это больше, не спасая близнеца между ними. Итак, вот так:
var twin = await this.registryManager.GetTwinAsync(serial);
var desired = new Desired(twin);
desired.Config = new Config(...);
var readOut = desired.Config; // THROWS AT LINE TwinCollection config = this.twin.Properties.Desired[ConfigProperty];
Я вижу в отладчике, что свойство Config там с правильными значениями. Но если я пытаюсь прочитать его самостоятельно, я получаю исключение BindingException: невозможно преобразовать JObject в TwinCollection. Если я сохраню двойник между ними, то он может быть прочитан без проблем.
Действительно, в отладчике, если я запрашиваю тип this.twin.Properties.Desired [ConfigProperty], это JObject! Как это может быть? В сеттере я передаю TwinCollection, так где же меняется информация о типе?