我目前有一个静态类,它有13个静态字段,每个静态字段都是静态只读列表。每个列表中的对象都是不同的类,但是所有13个类都扩展了同一个类。
我发现代码中有重复。我没有让我的代码得到每个列表13次,而是想要将列表放入字典中,并键入类型。我可以用字典上的迭代替换一些操作。
我准备了一个简单的工作示例,但无法获得返回特定类型列表的方法。 我可以让GetList方法返回List< T>吗
public class ListGetter
{
private static Dictionary<Type, List<Iab>> dict = new Dictionary<Type, List<Iab>>();
public static List<Iab> GetList<T>() where T : Iab
{
List<Iab> list = dict[typeof(T)];
return list;
}
}
public interface Iab
{
}
public class ClassA : Iab
{
}
public class ClassB : Iab
{
}
答案 0 :(得分:1)
是的,你可以。您需要更改签名以返回List<T>
而不是List<Iab>
并将内容转换为T.
public class ListGetter
{
private static Dictionary<Type, List<Iab>> dict = new Dictionary<Type, List<Iab>>();
static ListGetter()
{
var classAs = new List<Iab>();
for (int i = 0; i < 10; i++)
{
classAs.Add(new ClassA());
}
dict.Add(typeof(ClassA), classAs);
var classBs = new List<Iab>();
for (int i = 0; i < 20; i++)
{
classBs.Add(new ClassB());
}
dict.Add(typeof(ClassB), classBs);
}
public static List<T> GetList<T>() where T : Iab
{
var list = dict[typeof(T)];
return list.Cast<T>().ToList();
}
}
或者,你可以使用IEnumerable扩展方法OfType<T>
,但如果你经常访问这些列表,它可能会更慢。
public class ListGetter2
{
private static IList<Iab> _list;
static ListGetter2()
{
_list = new List<Iab>();
for (int i = 0; i < 10; i++)
{
_list.Add(new ClassA());
}
for (int i = 0; i < 20; i++)
{
_list.Add(new ClassB());
}
}
public static IList<T> GetList<T>() where T : Iab
{
return _list.OfType<T>().ToList();
}
}