//In a Static class ,extension implementation
public static IQueryable<T2> ToDTO<T, T2>(this IQueryable<T> source)
{
return source.To<T2>();
}
//Usage
var result = personType1Queryable.ToDTO< personType1, personType2>();
在上面的代码中,您看到了它的扩展名。它将一种类型转换为另一种类型所以首先这个引用的对象是personType1Queryable类型 IQueryable&lt; personType1&gt; 我只想这样调用这个函数;
personType1Queryable.ToDTO<personType2>();
我只想传递目的地类型。因为已经传递此引用的对象。但是编译器不接受这个为什么呢?对于Where&lt; T>在Linq的扩展工作。 对我来说为什么不呢?
编辑:我申请了Eren的回答。但似乎还有一些缺失。 //works
public static IQueryable<T2> ToDTO<T,T2>(this IQueryable<T> source)
{
return source.Project().To<T2>();
}
//gives object reference error. Shown below!
public static IQueryable<T> ToDTO<T>(this IQueryable<object> source)
{
return source.Project().To<T>();
}
答案 0 :(得分:1)
IQueryable<T>
在T
中是协变的,因此根据您在To<T>
扩展程序中的需要,您可能会放弃这一点:
public static IQueryable<T> ToDTO<T>(this IQueryable<object> source)
{
return source.To<T>();
}
请注意,仅当原始IQueryable<T>
的类型参数(例如personType1
)是引用类型时,此方法才有效。否则,您将收到编译器错误。
答案 1 :(得分:0)
Where
定义为
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate
)
正如你所看到它只使用一个通用参数,这就是为什么它在你提供它时“有效”的原因。 您的方法由两个参数定义。