无法将Type`Class`转换为T.

时间:2013-04-02 10:48:41

标签: c# asp.net generics

我在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>的两种方法?

2 个答案:

答案 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;