Прикрепление метаданных к свойствам объектов, которые вы не можете изменить? - PullRequest
0 голосов
/ 11 июля 2019

Для данного словаря (строка-объект), который может содержать примитивные типы данных, а также типы данных сложного класса, необходимо иметь возможность добавлять дополнительную информацию для некоторых свойств (может быть вложенной) без изменениясуществующие структуры данных в словаре и возможность получать эти метаданные для каждого свойства для последующего использования.Кроме того, эти метаданные должны быть сохранены для последующего использования, а не только во время выполнения, поэтому использование ссылок проблематично.

Решение, которое я пробовал, - сохранить дополнительные метаданные KeyValuePair в словаре.Например, чтобы определить свойство улицы адреса объекта данных как особенное и важное, будет добавлена ​​следующая информация

{ "root.Data.Address.Street", new Dictionary<string, object>()
            {
                { "special", true },
                { "important", true }
            }}

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

Пример случая:

//The data in the dictionary can't be changed or wrapped in some way
Dictionary<string, object> dataObject = new Dictionary<string, object>()
        {
            { "Name", "name123"},
            { "Addresses", new List<Address>()
                {
                    new Address("A", "B", 1),
                    new Address("C", "D", 2)
                }
            },
            {"Data", new Data("123Name", new Address("E", "F", 3))}
        };

//Can't be changed
public class Data
{
    public string Name { get; }
    public Address Address { get; }

    public Data(string name, Address address)
    {
        Name = name;
        Address = address;
    }
}

//Can't be changed
public class Address
{
    public string City { get; }
    public string Street { get; }
    public int Number { get; }

    public Address(string city, string street, int number)
    {
        City = city;
        Street = street;
        Number = number;
    }
}

Ожидаемое поведение - возможность запрашивать данные как можно ближе к следующему:

dataObject["Data"].Address.Street.special == true
dataObject["Data"].Address.City.important == false

Любые идеи приветствуются

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