首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >LINQ .Cast()扩展方法失败,但(类型)对象有效

LINQ .Cast()扩展方法失败,但(类型)对象有效
EN

Stack Overflow用户
提问于 2010-05-12 21:59:54
回答 2查看 5.6K关注 0票数 18

为了在一些LINQ To SQL对象和DTO之间进行转换,我们在DTO上创建了显式cast操作符。这样我们就可以做到以下几点:

代码语言:javascript
复制
DTOType MyDTO = (LinqToSQLType)MyLinq2SQLObj;

这样做效果很好。

但是,当您尝试使用LINQ .Cast()扩展方法进行强制转换时,它会出现一个无效的强制转换异常,声明不能将类型Linq2SQLType强制转换为类型DTOType。例如,下面的代码不起作用

代码语言:javascript
复制
List<DTO.Name> Names = dbContact.tNames.Cast<DTO.Name>()
                                               .ToList();

但是下面的代码运行良好:

代码语言:javascript
复制
DAL.tName MyDalName = new DAL.tName();
DTO.Name MyDTOName = (DTO.Name)MyDalName;

下面的代码也很好用

代码语言:javascript
复制
List<DTO.Name> Names = dbContact.tNames.Select(name => (DTO.Name)name)
                                               .ToList();

为什么.Cast()扩展方法抛出一个无效的强制转换异常?我过去曾多次以这种方式使用.Cast()扩展方法,当您将基类型之类的东西强制转换为派生类型时,它工作得很好,但当对象具有显式强制转换操作符时,它就会失败。

EN

回答 2

Stack Overflow用户

发布于 2013-08-29 02:14:46

如果反编译Linq程序集,您会得到类似以下代码。前面的答案是正确的,最终转换是从'object‘到target-type,这对于自定义类型总是失败的。

代码语言:javascript
复制
private static IEnumerable<TResult> CastIterator<TResult>( IEnumerable source )
{
    foreach(object current in source)
    {
        yield return (TResult)( (object)current );
    }
    yield break;
}

public static IEnumerable<TResult> DCast<TResult>( this IEnumerable source )
{
    IEnumerable<TResult> enumerable = source as IEnumerable<TResult>;
    if(enumerable != null)
    {
        return enumerable;
    }
    if(source == null)
    {
        throw new ArgumentNullException( "source" );
    }
    return CastIterator<TResult>( source );
}

TFish

票数 2
EN

Stack Overflow用户

发布于 2016-01-25 05:30:14

对于那些遇到这个问题的人来说,正在寻找解决办法...

代码语言:javascript
复制
Dim res = arrayOfStrings.Select(Function(__) CType( __, YourType ))

我不确定C#的确切语义,但我相信这很简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2819473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档