Драйвер MongoDB C # игнорирует свойство при сериализации, если геттер недоступен - PullRequest
0 голосов
/ 19 сентября 2018

Мне нужно save/serialize класс, в котором некоторые свойства могут иметь геттеры, которые могут быть недоступны во время выполнения.В моем особом случае это ECS (Entity-Component-System) -Entities, которые собираются во время выполнения, и поэтому не все Component-Properties доступны во время выполнения.Если вы не знаете, что делает ECS, просто продолжайте читать, здесь проблема не имеет значения.Если вам интересно узнать, что такое ECS, просто посмотрите здесь: ECS Wikipedia

Например, есть такой класс Entity:

public class MyEntity
{
    public PersonComponent person{get;set}
    public bool hasPersonComponent{get;}
    public AdressComponent adress{get;set;}
    public bool hasAdressComponent{get;}
}

Итакон содержит два компонента и свойство bool для каждого компонента, которое возвращает true, если эти компоненты даже существуют во время выполнения.

И карта классов для сериализации этих объектов

BsonClassMap.RegisterClassMap<MyEntity>(cm =>
        {
            cm.AutoMap();
            cm.MapMember(c => c.person);
            cm.MapMember(c => c.adress);
        });

MongoDB в настоящее время сериализуетсятолько эти классы сущностей, если все сопоставленные свойства существуют во время выполнения, так что все их получатели доступны.Если один из них отсутствует, MongoDB не сериализует весь класс и не сохраняется в БД.

Есть ли способ игнорировать эти свойства в serialization/saving этого класса?

Я уже обнаружил, что это можно сделать с помощью конвенций, а также нашел SetShouldSerializeMethod, но я не могу найти синтаксис для установки SetShouldSerializeMethod для установки сериализации соответствующего элемента / свойства в значение false для данногоhasComponent == false значение bool, которое является другим свойством того же класса.

Таким образом, псевдокод будет иметь вид:

if(!myEntity.hasPersonComponent) cm.MapMember(c => c.person).SetShouldSerialize(false);
if(!myEntity.hasAdressComponent) cm.MapMember(c => c.adress)SetShouldSerialize(false);

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

Заранее спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...