我需要在应用程序中保留已创建对象的列表。我有一个抽象对象和一些派生类。我想保留一个创建对象的列表,试图不要不必要地创建新对象..我试着用下面的代码来做这个,其中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;
}
答案 0 :(得分:2)
您似乎缺少通用约束来帮助编译器确保您的代码是类型安全的
public AbstractMapper Mapper<T>()
where T : AbstractMapper
这样,您只能将使用情况限制为从T
继承的AbstractMapper
。
无论如何,编译器应警告您T
不能转换为AbstractMapper
,而不是相反。
答案 1 :(得分:2)
您确定没有看到以下错误吗?
无法将类型'T'转换为'AbstractMapper'
问题是编译器无法保证您的泛型类型参数T
是AbstractMapper
的子类型。您应该添加泛型类型约束:
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}一样简单}}