C# 派生对象列表
我需要在应用程序中保留已创建对象的列表。我有一个抽象对象和许多派生类。我想保留已创建对象的列表,以避免不必要地创建新对象。。我试图用下面的代码来实现这一点,其中T是从AbstractMapper派生的。但是得到了错误 无法将类型“AbstractMapper”转换为“T” 将其添加到列表中时C# 派生对象列表,c#,.net,C#,.net,我需要在应用程序中保留已创建对象的列表。我有一个抽象对象和许多派生类。我想保留已创建对象的列表,以避免不必要地创建新对象。。我试图用下面的代码来实现这一点,其中T是从AbstractMapper派生的。但是得到了错误 无法将类型“AbstractMapper”转换为“T” 将其添加到列表中时 protected List<AbstractMapper> Mappers = new List<AbstractMapper>() public 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;
}
受保护列表映射器=新列表()
公共抽象映射器映射器()
{
foreach(映射器中的变量映射器)
{
if(mapper.Type==typeof(T.Name)
{
返回映射器;
}
}
var newMapper=GetClass(“mapper”);
Add((AbstractMapper)newMapper);
return(AbstractMapper)newMapper;
}
您似乎缺少帮助编译器确保代码类型安全的泛型约束
public AbstractMapper Mapper<T>()
where T : AbstractMapper
公共抽象映射器映射器()
其中T:AbstractMapper
通过这种方式,您可以将用法限制为仅继承自AbstractMapper
的T
s
无论如何,编译器应该警告您,
T
不能转换为AbstractMapper
,反之亦然 您似乎缺少帮助编译器确保代码类型安全的泛型约束
public AbstractMapper Mapper<T>()
where T : AbstractMapper
公共抽象映射器映射器()
其中T:AbstractMapper
通过这种方式,您可以将用法限制为仅继承自AbstractMapper
的T
s
无论如何,编译器应该警告您,
T
不能转换为AbstractMapper
,反之亦然 您确定没有看到以下错误吗
无法将类型“T”转换为“AbstractMapper”
问题是编译器不能保证泛型类型参数T
是AbstractMapper
的子类型。应添加泛型类型约束:
public AbstractMapper Mapper(),其中T:AbstractMapper
您可以考虑返回<代码> t>代码>而不是<代码>抽象映射器< /> >
您也可以考虑使用<代码>字典<代码>代替<<代码>列表< /> >,其中密钥是代码>类型(t)< /COD>。如果需要派生类型的对象池,还可以使用泛型类型的静态字段:public static class MapperProvider<T> where T : AbstractMapper
{
public static T Instance = GetType<T>(); //static initialization
}
公共静态类MapperProvider,其中T:AbstractMapper
{
public static T Instance=GetType();//静态初始化
}
从泛型类型定义
MapperProvider
创建的每个泛型类型都将有一个不同的静态实例
字段,从Mapper
中查找相应的实例只需返回MapperProvider即可。实例
您确定没有看到以下错误吗
无法将类型“T”转换为“AbstractMapper”
问题是编译器不能保证泛型类型参数T
是AbstractMapper
的子类型。应添加泛型类型约束:
public AbstractMapper Mapper(),其中T:AbstractMapper
您可以考虑返回<代码> t>代码>而不是<代码>抽象映射器< /> >
您也可以考虑使用<代码>字典<代码>代替<<代码>列表< /> >,其中密钥是代码>类型(t)< /COD>。如果需要派生类型的对象池,还可以使用泛型类型的静态字段:public static class MapperProvider<T> where T : AbstractMapper
{
public static T Instance = GetType<T>(); //static initialization
}
公共静态类MapperProvider,其中T:AbstractMapper
{
public static T Instance=GetType();//静态初始化
}
从泛型类型定义
MapperProvider
创建的每个泛型类型都将有一个不同的静态Instance
字段,从Mapper
中查找相应的实例非常简单,只需返回MapperProvider.Instance
您为什么会收到错误?您好。谢谢在“Mappers.Add”(“你为什么会出错?嗨,谢谢。”在“Mappers.Add(”