是否可以为此通用扩展方法仅传递一个参数?

时间:2013-02-08 14:32:25

标签: c# generics extension-methods

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

enter image description here

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

2 个答案:

答案 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 )

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