C# 使用lambda表达式获取子属性实例的路径

C# 使用lambda表达式获取子属性实例的路径,c#,lambda,reflection,linq-expressions,C#,Lambda,Reflection,Linq Expressions,我不是在寻找一个神奇的lambda表达式,我在寻找一种可行的方法,以尽可能最简单的方式解决我的问题 我有一些遗留代码无法更改以更好地满足我的需求,因此我正在寻找解决方法。我所拥有的: public class Settings { public class SubSettings { [SampleAttribute] public string Prop1 { get; set; } public string Prop

我不是在寻找一个神奇的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; }
}
原则是:

SubSettingsExtended1的实例从一些默认值反序列化(默认值不能在代码中,因为它们因客户端而异),并添加到默认值列表中。对于子设置SExtended2的实例也会执行相同的操作

当应用程序需要SubSettingsExtended1的实例时,它会在默认值中找到唯一的一个实例,进行深度复制,并将其添加到实例中

有一个过程可以映射出具有[SampleAttribute]的对象中存在的每个属性,并使用它存储和匹配一些外部相关数据。让我们调用生成路径的函数

将生成包含以下内容的字符串列表:

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

将生成包含以下内容的字符串列表:

[
    "root.Prop1",
]
[
    "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());
作为一种升级,它可以通过以下方式找到实例(前提是保证树中只有一个引用)

GenerateRelativePath(mSettings => testInstance);
并由此生成路径

我怀疑这样的事情可以用表达式和反射来完成,但我太沉迷于表达式了,自己也弄不明白


在此问题上的任何帮助都将不胜感激。

单身和反思。可能会出什么问题?我必须说,代码并没有清楚地显示您正在尝试做什么(至少我没有理解它)。您的第一个代码段有一个
SettingsTypeInstance
,一个
SettingsTypeClass
,提到
root.Property
rootWindow.Settings.Properts
,并且不清楚“生成”是什么意思(返回?通过反射在某处注入?)。请发一个帖子。我不知道林克在这里扮演什么角色。当然,这有很多,但简而言之,这只是一种循环/筛选/排序/分组的简洁方式,它似乎与您想要的内容无关。在阅读了问题的最后一部分后,您似乎想要得到一个
表达式的字符串表示形式
?我想在这里说一个讨厌的词,但这是不合适的。对不起,我有点累了,所以我把我的大部分该死的术语弄混了,写了一个不具代表性的例子。让我编辑一下这个问题,让它更有意义。兰姆达,不是林克。真不敢相信我在这里做了什么。@Groo我相信,但在特定的格式中,指定的格式。给我几分钟。它应该更有意义,没有压舱物。单粒子和反射。可能会出什么问题?我必须说,代码并没有清楚地显示您正在尝试做什么(至少我没有理解它)。您的第一个代码段有一个
SettingsTypeInstance
,一个
SettingsTypeClass
,提到
root.Property
rootWindow.Settings.Properts
,并且不清楚“生成”是什么意思(返回?通过反射在某处注入?)。请发一个帖子。我不知道林克在这里扮演什么角色。当然,这有很多,但简而言之,这只是一种循环/筛选/排序/分组的简洁方式,它似乎与您想要的内容无关。在阅读了问题的最后一部分后,您似乎想要得到一个
表达式的字符串表示形式
?我想在这里说一个讨厌的词,但这是不合适的。对不起,我有点累了,所以我把我的大部分该死的术语弄混了,写了一个不具代表性的例子。让我编辑一下这个问题,让它更有意义。兰姆达,不是林克。真不敢相信我在这里做了什么。@Groo我相信,但在特定的格式中,指定的格式。给我几分钟。在没有压舱物的情况下,它应该更有意义。
"Instances.[i]"
GenerateRelativePath(mSettings => testInstance);