1
 //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<personType1>我只想这样调用这个函数;

personType1Queryable.ToDTO<personType2>();

我只想传递目的地类型。因为这个引用的对象已经通过了。但是编译器不接受这个为什么?对于 Linq 中的 Where < T > 扩展,它可以工作。对我来说为什么不呢?

编辑:我应用了艾伦的回答。但它似乎仍然缺少一些东西。

  //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>();
    }

在此处输入图像描述

http://i.stack.imgur.com/9Yh6H.png

4

2 回答 2

1

IQueryable<T>在 中是协变的T,因此根据您在To<T>扩展中的需要,您可能会侥幸逃脱:

public static IQueryable<T> ToDTO<T>(this IQueryable<object> source)
{
    return source.To<T>();
}

请注意,这仅在原始IQueryable<T>(例如personType1)的类型参数是引用类型时才有效。否则,您将收到编译器错误。

于 2013-02-08T14:45:46.913 回答
0

Where定义为

public static IEnumerable<TSource> Where<TSource>( this IEnumerable<TSource> source, Func<TSource, bool> predicate )

正如您所看到的,它仅使用一个通用参数,这就是为什么当您提供一个时它“有效”的原因。您的方法是用两个参数定义的。

于 2013-02-08T14:36:06.077 回答