首页 > 解决方案 > 如何根据枚举返回不同的列表?

问题描述

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

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 个返回语句上都显示了一个错误,表明该类型无法转换为“T”。这是可能的/建议的还是这是代码的味道?

标签: c#generics

解决方案


你基本上不能这样做。

正如迈克的回答所说,为了进行GetValueFromType<T>编译,可以绕过静态类型检查,但你将如何调用它?您的调用代码将需要指定 T,例如。

var myValue = GetValueFromType<int>(myData)

因为无法从调用本身推断 T,并且当该方法尝试返回与您选择的 T 不匹配的列表时,您将获得 InvalidCastException。鉴于您需要询问MyData如何安全地调用此方法,您不妨在调用代码中设置开关。


推荐阅读