gpt4 book ai didi

c# - 实现一个查找表,它接受 T 并返回类型为 List 的方法的属性

转载 作者:太空狗 更新时间:2023-10-29 20:09:43 26 4
gpt4 key购买 nike

我有一个管理对象集合的类,例如List<Car>List<Bike>这是属性。

我想找到一种方法来在查找中获取对每个集合的引用,这样我就可以实现诸如 Add<Car>(myCar) 之类的方法。或 Add(myCar) (通过反射)并将其添加到正确的集合中。

我尝试了以下,

public class ListManager 
{
private Dictionary<Type, Func<IEnumerable<object>>> _lookup
= new Dictionary<Type, Func<IEnumerable<object>>>();

public ListManager()
{
this._lookup.Add(typeof(Car), () => { return this.Cars.Cast<object>().ToList(); });
this._lookup.Add(typeof(Bike), () => { return this.Bikes.Cast<object>().ToList(); });
}

public List<Car> Cars { get; set; }
public List<Bike> Bikes { get; set; }
}

但是.ToList()创建一个新列表而不是引用,所以 _lookup[typeof(Car)]().Add(myCar)仅添加到词典列表中。

最佳答案

这会起作用:

public class ListManager
{
private Dictionary<Type, IList> _lookup
= new Dictionary<Type, IList>();

public ListManager()
{
_lookup.Add(typeof(Car), new List<Car>());
_lookup.Add(typeof(Bike), new List<Bike>());
}

public List<Car> Cars
{
get { return (List<Car>)_lookup[typeof(Car)]; }
}

public List<Bike> Bikes
{
get { return (List<Bike>)_lookup[typeof(Bike)]; }
}

public void Add<T>(T obj)
{
if(!_lookup.ContainsKey(typeof(T))) throw new ArgumentException("obj");
var list = _lookup[typeof(T)];

list.Add(obj);
}
}

如果 CarBike 都派生自同一个类或实现同一个接口(interface),那就太好了。然后,您可以将类型约束添加到 Add 方法以获取编译错误而不是 ArgumentException

编辑

上面的简单解决方案有一个小问题。只有当添加到列表中的对象类型与 _lookup 字典中存储的类型完全相同时,它才会起作用。如果您尝试添加从 CarBike 派生的对象,它将抛出。

例如,如果您定义一个类

public class Batmobile : Car { }

然后

var listManager = new ListManager();
listManager.Add(new Batmobile());

将抛出 ArgumentException

为了避免这种情况,您将需要一种更复杂的类型查找方法。而不是简单的 _lookup[typeof(Car)] 它应该是:

private IList FindList(Type type)
{
// find all lists of type, any of its base types or implemented interfaces
var candidates = _lookup.Where(kvp => kvp.Key.IsAssignableFrom(type)).ToList();

if (candidates.Count == 1) return candidates[0].Value;

// return the list of the lowest type in the hierarchy
foreach (var candidate in candidates)
{
if (candidates.Count(kvp => candidate.Key.IsAssignableFrom(kvp.Key)) == 1)
return candidate.Value;
}

return null;
}

关于c# - 实现一个查找表,它接受 T 并返回类型为 List<T> 的方法的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33197248/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com