派生对象列表

时间:2015-09-06 18:49:15

标签: c# .net

我需要在应用程序中保留已创建对象的列表。我有一个抽象对象和一些派生类。我想保留一个创建对象的列表,试图不要不必要地创建新对象..我试着用下面的代码来做这个,其中T是从AbstractMapper派生的。但得到错误

  

无法转换类型' AbstractMapper'到了'

将其添加到列表

protected List<AbstractMapper> Mappers = new List<AbstractMapper>()

public AbstractMapper Mapper<T>()
    {
        foreach (var mapper in Mappers)
        {
            if (mapper.Type == typeof (T).Name)
            {
                return mapper;
            }
        }
        var newMapper = GetClass<T>("mapper");
        Mappers.Add((AbstractMapper)newMapper);
        return (AbstractMapper)newMapper;
    }

2 个答案:

答案 0 :(得分:2)

您似乎缺少通用约束来帮助编译器确保您的代码是类型安全的

public AbstractMapper Mapper<T>()
    where T : AbstractMapper

这样,您只能将使用情况限制为从T继承的AbstractMapper

无论如何,编译器应警告您T不能转换为AbstractMapper,而不是相反。

答案 1 :(得分:2)

您确定没有看到以下错误吗?

  

无法将类型'T'转换为'AbstractMapper'

问题是编译器无法保证您的泛型类型参数TAbstractMapper的子类型。您应该添加泛型类型约束:

public AbstractMapper Mapper<T>() where T : AbstractMapper

然后您可以考虑返回T而不是AbstractMapper

您可能还会考虑使用Dictionary代替List,其中密钥为typeof(T)。如果需要派生类型的对象池,还可以使用泛型类型的静态字段:

public static class MapperProvider<T> where T : AbstractMapper
{
    public static T Instance = GetType<T>(); //static initialization
}

从泛型类型定义MapperProvider<T>创建的每个泛型类型将具有不同的静态Instance字段,然后从Mapper<T>查找适当的实例就像返回{{1}一样简单}}