我有如下的类结构(简化):
public class MyBaseType
{
public string InstanceName { get; set; }
public List<MyBaseType> MyBaseTypeList = new List<MyBaseType>();
public List<MyObject1> MyObject1List = new List<MyObject1>();
public List<MyObject2> MyObject2List = new List<MyObject2>();
// Other properties
}
public class MyObject1
{
public string SimpleName { get; set; }
public string Name { get; set; }
// Other properties
}
public class MyObject2
{
public string SimpleName { get; set; }
public string Name { get; set; }
// Other properties
}
正如您所看到的,MyBaseType
的实例可以包含相同类型的实例列表以及MyObject1
和MyObject2
的列表。
对我来说,它的一个典型用法是呈现如下所示的结构:
MyBaseType instance1
|-> InstanceName = "instance1"
|
|-> MyBaseType instance2
| |-> InstanceName = "instance2"
| |
| |-> MyObject1 object1_1
| | |-> SimpleName = "object1_1"
| |-> MyObject2 object2_1
| | |-> SimpleName = "object2_1"
|
|-> MyBaseType instance3
| |-> InstanceName = "instance3"
| |
| |-> MyObject1 object1_2
| | |-> SimpleName = "object1_2"
| |-> MyObject2 object2_2
| | |-> SimpleName = "object2_1"
|
|-> MyObject1 object1_3
| |-> SimpleName = "object1_3"
|-> MyObject2 object2_3
| |-> SimpleName = "object2_3"
显然,这种结构会变得相当复杂。
但是,我需要做的是递归地深入到MyBaseType
列表中,跟踪所有的InstanceName
值,最后将带有MyObject1
或MyObject2
的SimpleName
组合字符串追加到两个对象的Name
属性。
按照上面的结构示例,名称将是:
MyObject1 object1_1 : instance1_instance2_object1_1
MyObject1 object2_1 : instance1_instance2_object2_1
MyObject1 object1_2 : instance1_instance3_object1_1
MyObject1 object2_2 : instance1_instance3_object1_2
MyObject1 object1_3 : instance1_object1_3
MyObject1 object2_3 : instance1_object2_3
我正在努力寻找一种方法来递归地迭代列表
并跟踪正在构造的名称。
尝试如下所示:
public class MyBaseType
{
public string InstanceName { get; set; }
public List<MyBaseType> MyBaseTypeList = new List<MyBaseType>();
public List<MyObject1> MyObject1List = new List<MyObject1>();
public List<MyObject2> MyObject2List = new List<MyObject2>();
public string GetName()
{
return $"{InstanceName}-{string.Join('-',MyBaseTypeList.Select(q => q.GetName()))}";
}
}
您可以尝试在传递基标识符的地方应用decorator模式。
将此方法添加到MyBaseType类中;
public Dictionary<string,MyObject1> GenerateString(string bString)
{
if(bString != null) bString += "_";
Dictionary<string, MyObject1> dict = new Dictionary<string, MyObject1>();
if (MyBaseTypeList.DefaultIfEmpty() != null)
{
dict = this.MyBaseTypeList.Select(s => s.GenerateString(bString + InstanceName)).SelectMany(d => d).ToDictionary(e => e.Key, e => e.Value);
}
MyObject1List.ForEach(myObject => dict.Add(bString + InstanceName + "_" + myObject.SimpleName,myObject));
MyObject2List.ForEach(myObject => dict.Add(bString + InstanceName + "_" + myObject.SimpleName,myObject));
return dict;
}
通过这种方式,你可以得到所有对象的字典,并将它们的路径作为关键字。
您所需要的只是用一个null作为参数调用基对象中的函数。 (实例1)
但是,我将MyObject2更改为Myobject1,因为它们是相同的对象(从这个类继承)