我已经看到人们问过类似的问题,但是他们通常使用复杂的类型并决定改用接口。我想做的是根据枚举返回列表,列表或列表。像这样:
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'。这可能/建议吗,还是有代码味?
答案 0 :(得分:2)
您基本上无法做到这一点。
可以按照Mike的回答规避静态类型检查,以便进行GetValueFromType<T>
的编译,但是您将如何调用它呢?您的调用代码将需要指定T,例如。
var myValue = GetValueFromType<int>(myData)
因为无法从调用本身推断T,并且当该方法尝试返回与您选择的T不匹配的列表时,您将收到InvalidCastException。假设您需要询问MyData
来找出如何安全地调用此方法,则最好在调用代码中进行切换。
答案 1 :(得分:1)
这有点危险,因为它失去了静态类型检查的某些功能,而且调用者很容易出错。编译器将对其进行标记。您可能需要插入一个(对象)类型转换,以告诉编译器您确实要进行类型转换:
return (IList<T>) (object) MonthValues;