Получить путь к дочернему экземпляру свойства, используя лямбда-выражения - PullRequest
1 голос
/ 10 апреля 2019

Я не ищу волшебное лямбда-выражение, я ищу действенный способ решить мою проблему самым простым способом.

У меня есть какой-то устаревший код, который я не могу изменить, чтобы лучше соответствовать моим требованиямтак что я ищу обходной путь.Что у меня есть:

public class Settings
{
    public class SubSettings 
    {
         [SampleAttribute]
         public string Prop1 { get; set; }

         public string Prop2 { get; set; }
    } 

    public class SubSettingsExtended1:SubSettings
    {            
    } 

    public class SubSettingsExtended2:SubSettings
    {            
    } 

    public List<SubSettings> Defaults { get; set; }
    public List<SubSettings> Instances {get; set; }
}

экземпляр, с которым я буду работать:

var mSettings = new Settings();
mSettings.Defaults.Add((new SubSettingsExtended1()).PopulateFromFile());
var testInstance = (new SubSettingsExtended2()).PopulateFromFile();
mSettings.Defaults.Add(testInstance);

Принцип:

Экземпляр SubSettingsExtended1 десериализуется из некоторых значений по умолчанию (значения по умолчанию не могут быть в коде, поскольку они различаются для клиентов) и добавляется в список По умолчанию .То же самое делается для экземпляра SubSettingsExtended2 .

Когда приложению требуется экземпляр SubSettingsExtended1 , он находит единственный из Defaults делает глубокую копию и добавляет ее к Экземплярам .

Существует процедура, которая отображает каждое свойство, существующее в объекте, который имеет [SampleAttribute] и использует его для хранения и сопоставления некоторых внешних связанных данных.Давайте назовем функцию, которая делает это GeneratePaths .

var paths = GeneratePaths(new SubSettingsExtended1());

выдаст список строк, содержащих:

[
    "root.Prop1",
]

, а

var paths = GeneratePaths(mSettings);

создаст список строк, содержащий:

[
    "root.Defaults.[0].Prop1",
    "root.Defaults.[1].Prop1"
]

Когда экземпляр по умолчанию копируется в экземпляры, мне нужно изменить путь по умолчанию ( "root.Prop1" ) в относительный ( "root.Instances. [i] .Prop1" , где i - соответствующий индекс).

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

Мне нужно что-то вроде

GenerateRelativePath(mSettings=>mSettings.Instances[i]);
GenerateRelativePath(mSettings=>mSettings.Instances.At(i));
GenerateRelativePath(mSettings=>mSettings.Instances.OfType<SubSettingsExtended2>().FirstOrDefault());

, которое будет возвращать строковое значение

"Instances.[i]"

В качестве обновления он может найти экземпляр (при условии, что былгарантирует только одну ссылку в дереве), просто давая что-то вроде

GenerateRelativePath(mSettings => testInstance);

и генерируя путь из этого.

Я подозреваю, что что-то подобное можно сделать с помощью выражений и отражений, но яЯ слишком потерян в выражениях, чтобы понять это сам.

Любая помощь по этому вопросу будет принята с благодарностью.

...