Bri*_*man 4 .net linq casting interface iqueryable
我有一个Something实现的类ISomething.如何将/转换为/转换IQueryable<Something>为IQueryable<ISomething>.当我尝试强制转换时,我能够编译,但强制转换的结果总是为NULL.
背景:我这样做的原因是因为我的Something类是一个CodeSmith生成的类(PLINQO模板),它具有表映射装饰,方法等.我的ISomething界面是"POCO风格",因为它是愚蠢的,只是镜像Something该类的属性.它也存在于它自己的命名空间中.我这样做,所以我不必引用Something从我的服务层保存类的程序集.保存Something类的程序集现在只需要在我的存储库层中引用.
Joe*_*orn 11
要了解这里发生了什么,从类型系统的角度来看这一点非常重要.该型系统,Something并且ISomething两种类型的拥有的传承样的关系(执行不完全继承,但接近).泛型类型IQueryable<Something>并IQueryable<ISomething>没有这种关系.它们是两种完全不同的类型,并且属于继承树(包含IQueryable的分支)的完全不同的部分,而不是Something或ISomething.
因此,从铸造时IQuerable<Something>到IQueryable<ISomething>,只要型系统而言,你不妨尝试从投IQueryable<double>来IQueryable<IDataRecord>.结果是一样的:它不知道如何进行转换,因此as运算符返回null.
这个问题的一个解决方案(不是问题本身,正如其他人所指出的)称为协方差,是在C#4.0中实现的..NET类型差异允许类型系统具有有限理解专业化两种不同类型的专门相同的通用类型,使得从一个到另一个类型可以铸造时之间关系变化(这里要注意的根字).
对于.Net 4之前的代码,您必须使用类似.Cast<T>()扩展方法的内容.但这不太理想,因为它会强制进行真正的强制转换操作,其中类型差异允许框架使用已经存在的实际类型.
您可以使用LINQ方法Cast
IQueryable<Something> something = ...
IQueryable<ISomething> casted = something.Cast<ISomething>();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1733 次 |
| 最近记录: |