Я не ищу волшебное лямбда-выражение, я ищу действенный способ решить мою проблему самым простым способом.
У меня есть какой-то устаревший код, который я не могу изменить, чтобы лучше соответствовать моим требованиямтак что я ищу обходной путь.Что у меня есть:
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);
и генерируя путь из этого.
Я подозреваю, что что-то подобное можно сделать с помощью выражений и отражений, но яЯ слишком потерян в выражениях, чтобы понять это сам.
Любая помощь по этому вопросу будет принята с благодарностью.