代码之家  ›  专栏  ›  技术社区  ›  Aleksandar

从泛型集合到C中特定类型集合的类型转换#

  •  0
  • Aleksandar  · 技术社区  · 2 年前

    假设以下代码:

    public ObservableCollection<Dog> TblDogs { get; set; } = new ObservableCollection<Dog>();
    public ObservableCollection<Health> TblDogHealth { get; set; } = new ObservableCollection<Health>();
    public ObservableCollection<Pedigree> TblDogPedigree { get; set; } = new ObservableCollection<Pedigree>();
    
    private ObservableCollection<T>? GetList<T>(Enum e)
    {
        switch (e.GetType().Name)
        {
            case "TblDogs": return TblDogs;
            case "TblDogHealth": return TblDogHealth;
            case "TblDogPedigree": return TblDogPedigree;
        }
        return null;
    }
    

    该方法应该基于 Enum 作为参数提供的类型(从而使值类型指向引用类型) IEnumerable 可用的方法)。

    代码提供了一个类型转换失败,但如下所示: enter image description here

    我尝试让自定义数据类型从一个空类继承,并让方法的返回类型适合继承的类,但没有成功。对于这样的问题,有解决方法吗?

    1 回复  |  直到 2 年前
        1
  •  0
  •   D Stanley    2 年前

    您的代码不能保证返回类型与枚举类型匹配。拨打以下电话是完全合法的:

    var dogList = GetList<Health>(TypeEnum.Pedigree);
    

    你可以 明确地 铸造:

    private ObservableCollection<T>? GetList<T>(Enum e)
    {
        switch (e.GetType().Name)
        {
            case "TblDogs": return TblDogs as ObservableCollection<T>;
            case "TblDogHealth": return TblDogHealth as ObservableCollection<T>;
            case "TblDogPedigree": return TblDogPedigree as ObservableCollection<T>;
        }
        return null;
    }
    

    将返回 null 如果请求的输出类型与枚举值不匹配。

    或者只是不使用泛型方法(因为你的方法不是真正的泛型),而是使用真正的类型安全:

    private ObservableCollection<Dog> GetDogList()
    {
        return TblDogs;
    }
    private ObservableCollection<Health> GetHealthList()
    {
        return TblDogHealth;
    }
    private ObservableCollection<Pedigree> GetPedigreeList()
    {
        return TblDogPedigree;
    }