我正在尝试构建一个基本的依赖注入容器,以使自己更好地了解它们的工作方式。我的容器的部分之一是将一个别名映射到班级名称。然后可以递归映射此类以产生层次列表。它还必须处理映射到自身的情况。
例如,说我有以下映射:
var map = new List<Map>() {
{ new Map("Foo", "Foo") },
{ new Map("foo", "Foo") }
};
地图是:
public class Map {
public string Name { get; set; }
public string Class { get; set; }
public Map(string name, string @class) {
Name = name;
Class = @class;
}
}
我想编写一个方法(getMap),该方法将返回给定名称的根(名称)和最高级别的父(类)。例如,我说:
var map = GetMap(map, "Foo");
var map2 = GetMap(map, "foo");
两个变量都将返回带有名称" foo"和类" foo"的新地图。这是进一步解释的另一个例子。给定以下地图:
var map = new List<Map>() {
{ new Map("Foo", "FooExtended") },
{ new Map("foo", "Foo") }
};
它将产生一个名称为" foo"和类" fooxtended"的新地图。
这是我的第一次尝试:
private Map GetMap(List<Map> map, string @class, string name = null) {
var item = map.SingleOrDefault(m => m.Name == @class);
if (item != null && @class != item.Class) {
return GetMap(map, item.Class, @class);
} else {
return new Map(name ?? @class, @class);
}
}
这两个示例都正确地返回了带有正确类的地图。但是,两个示例返回的名称都是" foo"。这应该是" foo",因为这是层次结构的根。
我希望我已经很好地解释了这一点。如果有人可以告诉我我做错了什么,我会很感激。谢谢
尝试此
public Map GetMap(List<Map> map, string name, string finalName = null) {
var item = map.SingleOrDefault(m => m.Name == name);
if (item != null && name != item.Class) {
return GetMap(map, item.Class, finalName ?? name); // <- for you, name ?? @class
} else {
return new Map(finalName ?? name, name);
}
}
您需要沿整个执行路径沿着name
(或我的情况finalName
)传递
编辑 - 这不是一个完整的解决方案,但我要离开
我重命名了测试中的参数,所以我更容易阅读,对此感到抱歉。
我的整个LINQPAD代码
void Main()
{
var map = new List<Map>() {
{ new Map("FooExtended", "FooExtended2") },
{ new Map("Foo", "FooExtended") },
{ new Map("foo", "Foo") }
};
var newMap = GetMap(map, "foo");
newMap.Dump(); // Gives Map("foo", "FooExtended2")
}
public class Map {
public string Name { get; set; }
public string Class { get; set; }
public Map(string name, string @class) {
Name = name;
Class = @class;
}
}
private static Map GetMap(List<Map> map, string name, string finalName = null) {
var item = map.SingleOrDefault(m => m.Name == name);
if (item != null && name != item.Class) {
return GetMap(map, item.Class, finalName ?? name);
} else {
return new Map(finalName ?? name, name);
}
}
再次编辑 - 基于注释
的实际答案最终答案,GetMap
将返回最高类型的名称(例如foo
)和最低的类(例如Foo
)
private static Map GetMap(List<Map> map, string name) {
return new Map(GetMapName(map, name), GetMapClass(map, name));
}
private static string GetMapName(List<Map> map, string name) {
var item = map.SingleOrDefault(m => m.Name != name && m.Class == name);
return item != null ? GetMapName(map, item.Name) : name;
}
private static string GetMapClass(List<Map> map, string name) {
var item = map.SingleOrDefault(m => m.Name == name && m.Class != name);
return item != null ? GetMapClass(map, item.Class) : name;
}
我使用了上面发布的代码,并且我得到了" foo"," fooextended2",无论我使用哪个名字或类。
希望会有所帮助。