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

Type conversion from a collection of generics to a collection of a specific type in C#

提问人:Aleksandar 提问时间:11/12/2023 最后编辑:Aleksandar 更新时间:11/12/2023 访问量:43

问:

假设以下代码:

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;
}

该方法应该根据作为参数提供的类型,从类本身中的类返回现有集合作为属性(从而使值类型指向引用类型,使方法可用)。EnumIEnumerable

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

我尝试使自定义数据类型继承自空类,并使方法的返回类型适合继承的类,但没有奏效。有没有解决这样的问题?

C# 泛型 类型转换

评论

0赞 Sweeper 11/12/2023
这是否像您之前的问题一样,在调用站点的 ,您实际上不知道枚举的类型?如果是这样,这是不可能的。GetList
0赞 Aleksandar 11/12/2023
@Sweeper 再次嗨,感谢昨天的帮助!问题是,我正在基于与数据库中的列匹配的一组枚举进行循环,并尝试使用可重用的函数来填充一组不同表中的一组集合。昨天我只需要我们修复的列的名称,但现在我试图从提供的枚举中推断出已经存在的集合。我添加了一些行来阐明自定义数据类型已经存在的属性,但我不知道如何使它们适合泛型函数

答:

0赞 D Stanley 11/12/2023 #1

代码不保证返回类型与枚举类型匹配。调用:

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;
}    

评论

0赞 Aleksandar 11/12/2023
选角明确奏效。问题是,我确信该方法永远不会被调用,除了我定义的那些之外,其他枚举类型,所以就像你说的那样,它本身真的不是泛型的,而是为了适应已经存在的方法,以根据提供的枚举进行循环。感谢您的帮助!