Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 派生对象列表_C#_.net - Fatal编程技术网

C# 派生对象列表

C# 派生对象列表,c#,.net,C#,.net,我需要在应用程序中保留已创建对象的列表。我有一个抽象对象和许多派生类。我想保留已创建对象的列表,以避免不必要地创建新对象。。我试图用下面的代码来实现这一点,其中T是从AbstractMapper派生的。但是得到了错误 无法将类型“AbstractMapper”转换为“T” 将其添加到列表中时 protected List<AbstractMapper> Mappers = new List<AbstractMapper>() public AbstractMapper

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

无法将类型“AbstractMapper”转换为“T”

将其添加到列表中时

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(”