我不是在寻找神奇的lambda表达式,而是在寻找一种可行的方法来以最简单的方式解决问题。
我有一些遗留代码,我无法对其进行更改以更好地满足我的要求,因此我正在寻找解决方法。我所拥有的:
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 的实例从一些默认值开始反序列化(默认值不能在代码中,因为它们因客户端而异)并添加到 Defaults 列表中。对于 SubSettingsExtended2 的实例也是如此。
当应用程序需要 SubSettingsExtended1 实例时,它会在 Defaults 中找到唯一的实例,进行深拷贝,并将其添加到 Instances 。
有一个过程可以映射出具有 [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);
并从中生成路径。
我怀疑可以使用“表达式”和“反射”来完成类似的操作,但是在表达式中迷失了自己的位置。
对此事的任何帮助将不胜感激。