我在C#中写了一个generice方法:
private T GetMamConfigurations<T>(IDictionary<string, object> items,
MaMDBEntities maMDBEntities) where T : class
{
T geoConfigs = default(T);
if (typeStr.Equals("MamConfiguration", StringComparison.OrdinalIgnoreCase))
{
geoConfigs = (T)GetGeoConfigurationNumericFromDB(items, maMDBEntities);
}
else if (typeStr.Equals("ListOfMamConfiguration", StringComparison.OrdinalIgnoreCase))
{
geoConfigs = (T)GetGeoConfigurationsPercentageFromDB(items, maMDBEntities);
}
return geoConfigs;
}
GetGeoConfigurationNumericFromDB
返回MamConfiguration
,而
GetGeoConfigurationsPercentageFromDB
返回IList<MamConfiguration>
我得到了恭维错误:
无法将
MamConfiguration
类型的表达式转换为T
类型
为什么?
有没有办法解决没有forcinf返回IList<MamConfiguration>
的两种方法?
答案 0 :(得分:1)
好吧,您可以通过在中间添加object
强制转换来安抚编译器:
geoConfigs = (T)(object)GetGeoConfigurationNumericFromDB(items, maMDBEntities);
将推迟类型检查直到运行时。然而!否则没有编译器方法可以做到这一点,因为它对"MamConfiguration"
之类的字符串测试永远不会满意。此外,当代码是...... 泛型时,泛型可以很好地工作 - 即每个类型都做同样的事情。显示的代码与 generic 相反。它是通过通用API公开的非通用代码。里面总是很乱。我个人会首先尝试避免这种用法。
答案 1 :(得分:0)
您可以使用(T)
运算符,而不是使用T
转换为as
。如果转换失败,as
将返回null
。如果成功,它将返回您转换后的值。
geoConfigs = GetGeoConfigurationNumericFromDB(items, maMDBEntities) as T;