c# – 在linq查询中转换泛型类型

前端之家收集整理的这篇文章主要介绍了c# – 在linq查询中转换泛型类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我有一个接受泛型类型参数的类,如果type参数是给定类型的子类,则会进行一些特殊处理.
IEnumerable<T> models = ...

// Special handling of MySpecialModel
if (filterString != null && typeof(MySpecialModel).IsAssignableFrom(typeof(T)))
{
    var filters = filterString.Split(...);
    models = 
        from m in models.Cast<MySpecialModel>()
        where (from t in m.Tags
               from f in filters 
               where t.IndexOf(f,StringComparison.CurrentCultureIgnoreCase) >= 0
               select t)
              .Any()
        select (T)m;
}

但是我在最后一行得到例外

Cannot convert type 'MySpecialModel' to 'T'

如果我更改代码而不是强制转换,我会收到此错误.

The type parameter 'T' cannot be used with the 'as' operator because it does not have a class type constraint nor a 'class' constraint.

我在这里错过了什么?

更新

这个类需要可以采用任何类型参数,包括结构和内置类型,因此在我的情况下,通用约束不是一个合适的解决方案.

解决方法

选择(x =>(MySpecialModel)x)

LINQ Cast< T> method仅适用于将元素转换为元素已经存在的元素(例如基类型,派生类型或接口).它不打算转换能够转换为目标类型的对象. (例如,新的List< int> {1,2,3} .Cast< long>()也会抛出异常.

上面的答案没有错,但它没有解决这个问题.

仅仅因为你已经通过反射证明泛型参数绑定到给定类型,并不意味着编译器知道它是.为了使其工作,您需要将T实例转换为公共类型(例如对象),然后将其转换为特定类型.例如(将查询中的最后一行更改为选择(T)(对象)m应该可以解决问题.

猜你在找的C#相关文章