繁体   English   中英

通用C#方法,返回指定类型的列表

[英]Generic C# method which returns lists of the specified type

我目前有一个静态类,其中包含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
{
}

是的你可以。 您需要更改签名以返回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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM