返回指定类型列表的泛型C#方法

返回指定类型列表的泛型C#方法,c#,generics,C#,Generics,我目前有一个静态类,它有13个静态字段,每个字段都是静态只读列表。每个列表中的对象属于不同的类,但所有13个类都扩展了同一个类 我发现代码中存在重复。我没有让我的代码将每个列表重复13次,而是想把列表放入字典,键入类型。我可以用字典上的迭代来替换一些操作 我准备了一个简单的工作示例,但无法获得返回特定类型列表的方法我可以让GetList方法返回列表吗? public class ListGetter { private static Dictionary<Type, List<

我目前有一个静态类,它有13个静态字段,每个字段都是静态只读列表。每个列表中的对象属于不同的类,但所有13个类都扩展了同一个类

我发现代码中存在重复。我没有让我的代码将每个列表重复13次,而是想把列表放入字典,键入类型。我可以用字典上的迭代来替换一些操作

我准备了一个简单的工作示例,但无法获得返回特定类型列表的方法我可以让GetList方法返回列表吗?

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
{
}
公共类ListGetter
{
私有静态字典dict=新字典();
公共静态列表GetList(),其中T:Iab
{
列表=dict[类型(T)];
退货清单;
}
}
公共接口
{
}
A类公共课:Iab
{
}
B类公共课:Iab
{
}

是的,你可以。您需要更改签名以返回
List
而不是
List
,并将内容强制转换为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();
    }
}
公共类ListGetter
{
私有静态字典dict=新字典();
静态ListGetter()
{
var classAs=新列表();
对于(int i=0;i<10;i++)
{
Add(新的ClassA());
}
dict.Add(typeof(ClassA),classAs);
var classBs=新列表();
对于(int i=0;i<20;i++)
{
Add(新的ClassB());
}
dict.Add(typeof(ClassB),classBs);
}
公共静态列表GetList(),其中T:Iab
{
var列表=dict[类型(T)];
return list.Cast().ToList();
}
}
或者,您可以只使用类型为的IEnumerable扩展方法,但如果您经常访问列表,则速度可能会较慢

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();
    }
}
公共类ListGetter2
{
私有静态IList_列表;
静态ListGetter2()
{
_列表=新列表();
对于(int i=0;i<10;i++)
{
_添加(新的ClassA());
}
对于(int i=0;i<20;i++)
{
_添加(新类b());
}
}
公共静态IList GetList(),其中T:Iab
{
返回_list.OfType().ToList();
}
}

See
List
是不变的,因此您不能将它们存储在词典中,尽管您可以使用
IEnumerable
。然后您必须在
GetList
方法中向下转换到
List
;如果返回类型是List,我调用define-concrete-type的方法,比如在我的示例中:var entities=dal.GetDataFromDataBase()@DmitrySokolov,那么为什么只返回带有具体类型List的变量不起作用呢?ToList会将结果从
IEnumerable
更改为
List
。在这个问题中,作者有一个字典,其中包含两个实现同一接口的类,并且正在寻找一种方法将具体类型作为列表返回。这必须在运行时发生,因为调用代码时会指定要返回的类型。