c# - 如何根据枚举返回不同的列表?
问题描述
我看到人们问过类似的问题,但他们通常使用复杂类型并决定使用接口。我想做的是根据枚举传回列表、列表或列表。像这样的东西:
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”。这是可能的/建议的还是这是代码的味道?
解决方案
你基本上不能这样做。
正如迈克的回答所说,为了进行GetValueFromType<T>
编译,可以绕过静态类型检查,但你将如何调用它?您的调用代码将需要指定 T,例如。
var myValue = GetValueFromType<int>(myData)
因为无法从调用本身推断 T,并且当该方法尝试返回与您选择的 T 不匹配的列表时,您将获得 InvalidCastException。鉴于您需要询问MyData
如何安全地调用此方法,您不妨在调用代码中设置开关。
推荐阅读
- react-native - React Native Text over TouchableOpacity 正在被剪切
- javascript - `assert.IfError(value)` 的玩笑替代品
- java - 充分利用 Java 中的多态性
- airflow - Airflow - 在本地写入文件的任务 (GCS)
- pentaho-data-integration - 根据另一个数据网格输入向我的数据网格输入添加一个新字段
- javascript - 搜索结果的粗体子字符串取决于 searchquery
- c# - 检查是否在单元测试中使用某个参数调用了函数
- javascript - 浅色/深色主题切换
- android - 为什么Android上的状态栏占用这么多空间?
- postgresql - Hive 空间函数