如何根据枚举返回不同的列表?

时间:2019-06-20 16:11:52

标签: c# generics

我已经看到人们问过类似的问题,但是他们通常使用复杂的类型并决定改用接口。我想做的是根据枚举返回列表,列表或列表。像这样:

private IList<T> GetValueFromType<T>(MyData data)
{
    switch (data.SomeType)
    {
        case MyType.Percent:
           var PercentValues = new List<double>();
           PercentValues.Add(data.CompAPercentage);                   
           PercentValues.Add(data.CompBPercentage);
           return (T)PercentValues;
        case MyType.Money:
           var MoneyValues = new List<decimal>();
           MoneyValues.Add(data.CompAMoney);
           MoneyValues.Add(data.CompBMoney);
           return (T)MoneyValues;
        case MyType.Months:
           var MonthValues = new List<int>();
           MonthValues.Add(data.CompAMonth);
           MonthValues.Add(data.CompBMonth);
           return (T)MonthValues;
    }
}

这在所有3个return语句上均显示错误,表明该类型无法转换为'T'。这可能/建议吗,还是有代码味?

2 个答案:

答案 0 :(得分:2)

您基本上无法做到这一点。

可以按照Mike的回答规避静态类型检查,以便进行GetValueFromType<T>的编译,但是您将如何调用它呢?您的调用代码将需要指定T,例如。

var myValue = GetValueFromType<int>(myData)

因为无法从调用本身推断T,并且当该方法尝试返回与您选择的T不匹配的列表时,您将收到InvalidCastException。假设您需要询问MyData来找出如何安全地调用此方法,则最好在调用代码中进行切换。

答案 1 :(得分:1)

这有点危险,因为它失去了静态类型检查的某些功能,而且调用者很容易出错。编译器将对其进行标记。您可能需要插入一个(对象)类型转换,以告诉编译器您确实要进行类型转换:

return (IList<T>) (object) MonthValues;