为了在一些LINQ To SQL对象和DTO之间进行转换,我们在DTO上创建了显式cast操作符。这样我们就可以做到以下几点:
DTOType MyDTO = (LinqToSQLType)MyLinq2SQLObj;
这样做效果很好。
但是,当您尝试使用LINQ .Cast()扩展方法进行强制转换时,它会出现一个无效的强制转换异常,声明不能将类型Linq2SQLType强制转换为类型DTOType。例如,下面的代码不起作用
List<DTO.Name> Names = dbContact.tNames.Cast<DTO.Name>()
.ToList();
但是下面的代码运行良好:
DAL.tName MyDalName = new DAL.tName();
DTO.Name MyDTOName = (DTO.Name)MyDalName;
下面的代码也很好用
List<DTO.Name> Names = dbContact.tNames.Select(name => (DTO.Name)name)
.ToList();
为什么.Cast()扩展方法抛出一个无效的强制转换异常?我过去曾多次以这种方式使用.Cast()扩展方法,当您将基类型之类的东西强制转换为派生类型时,它工作得很好,但当对象具有显式强制转换操作符时,它就会失败。
发布于 2013-08-29 02:14:46
如果反编译Linq程序集,您会得到类似以下代码。前面的答案是正确的,最终转换是从'object‘到target-type,这对于自定义类型总是失败的。
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
发布于 2016-01-25 05:30:14
对于那些遇到这个问题的人来说,正在寻找解决办法...
Dim res = arrayOfStrings.Select(Function(__) CType( __, YourType ))
我不确定C#的确切语义,但我相信这很简单。
https://stackoverflow.com/questions/2819473
复制相似问题