2013-02-08 56 views
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>擴展。 對我而言,爲什麼不呢?

編輯:我申請了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

+0

什麼是編譯器錯誤。 – 2013-02-08 14:34:23

+1

http://blog.slaks.net/2010/12/partial-type-in​​ference-in-net.html – SLaks 2013-02-08 14:34:30

+0

@EliGassert:沒有過載有1個通用參數。 – SLaks 2013-02-08 14:35:05

回答

1

IQueryable<T>T協變的,所以要根據您在To<T>擴展需要什麼,你可能會與此脫身:

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

請注意,這隻會工作,如果原來的IQueryable<T>的類型參數(例如personType1)是參考類型。否則,你會得到一個編譯器錯誤。

+0

對於值類型的擴展沒有出現:) – 2013-02-08 15:06:06

0

Where被定義爲

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

正如你可以看到它僅使用一個通用的參數,這就是爲什麼它 '作品',當你提供一。 你的方法是用兩個參數定義的。

+0

對於你不需要通過的地方 AFAIK你可以通過這種方式查詢Where(謂詞)。它從這個推薦的IEnumerable 中知道TSource。而且我也不想再次傳遞這個參數的類型。 – 2013-02-08 14:42:20

+0

是的,但是OP說這兩種類型中的一種'T'可以從參數中推斷出來。他們想明確地通過第二個。 – 2013-02-08 14:43:21

相關問題