列表<t>项目的通用T </t>

时间:2012-02-06 21:14:05

标签: c# generics

如果以前曾问过这个问题,我很抱歉,我找不到类似的东西。

我有一个可以选择进入我班级的选择:

public enum OrdinalValue
{
   None = 0,
   Qualification = 1,
   Career = 2,
   Faculty = 3
}

基于这个可枚举的,我有3个属性调用,它们从实体集合中为每个调用带来数据:

public List<Qualification> ByQualification { get; set; }
public List<Career> ByCareer { get; set; }
public List<Faculty> ByFaculty { get; set; }

我想基于从调用方法传回的枚举来创建一个返回正确属性的泛型方法,如:

public List<T> GetEntities<T>(OrdinalValue ord)
{
    List<T> value = default(List<T>);

    // based on enum, cast the correct List<T> and return value
    // something like:
    if (ord == OrdinalValue.Career)
        return (List<T>)Convert.ChangeType(this.ByCareer, typeof(T));

    return value;
}

有可能吗?

2 个答案:

答案 0 :(得分:6)

听起来你想要这样的东西:

public List<T> GetEntities<T>(OrdinalValue ord)
{
    object ret;

    switch(ord)
    {
        case OrdinalValue.Career:
            ret = ByCareer;
            break;
        case OrdinalValue.Faculty:
            ret = ByFaculty;
            break;
        case OrdinalValue.Qualification:
            ret = ByQualification;
            break;
        default:
            throw new ArgumentOutOfRangeException("ord");
    }
    return (List<T>) ret;
}

然而,这对我来说并不是一个好的设计。如果不了解更多关于更大图片的内容,很难提出更好的建议,但它并不像真正的泛型方法。

答案 1 :(得分:1)

我认为@Jon正走在正确的轨道上,在这里过分复杂的事情毫无意义。当维护方法过于复杂时,你应该考虑一直这样做。

但是,我认为他的方法可以简化。您无需传递OrdinalValue参数。您可以检查typeof(T),而不是检查它。编译器无论如何都需要在编译时知道T.