使用Lambda表达式获取子属性实例的路径

时间:2019-04-10 13:27:16

标签: c# lambda reflection linq-expressions

我不是在寻找神奇的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);

并从中生成路径。

我怀疑可以使用“表达式”和“反射”来完成类似的操作,但是在表达式中迷失了自己的位置。

对此事的任何帮助将不胜感激。

0 个答案:

没有答案