2012-04-17 52 views
0

我試圖擴展一個已經有返回類型的方法。例如:擴展一個返回類型的方法

IQueryable<int> GetCategoryIds() 

所以,我可以用這個如下:

IQueryable<int> categories = GetCategoryIds(); 

而且目前我正在做:

IQueryable<int> categories = GetCategoryIds().Select(c => new Client() { ClientId == c.clientId }); 

這工作,但我不希望這樣做Select聲明。我寧願做一個擴展方法,除了type,所以我可以在擴展方法中使用反射來確定類型等,並返回結果。擴展方法是這樣的:

public static IQueryable<T> LovelyExtension(this T objectType, int clientId) 

然後我就可以使用這個擴展名狀(希望):

IQueryable<int> categories = GetCategoryIds().LovelyExtension<int>(1); 

這可能嗎?當我嘗試它時,我得到一個錯誤,因爲GetCategoryIds返回類型與擴展方法不一樣。但是,這適用於Select聲明。

+3

你選擇的版本沒有任何意義 - 它應該返回的IEnumerable'',不'名單',所以你分配給'categories'應編譯失敗... – 2012-04-17 13:50:46

回答

2

你不需要在Type上寫擴展名(你的例子也沒有這樣做)。您需要在IQueryable<T>上進行分機。你可以這樣做:

public static IQueryable<T> LovelyExtension<T>(this IQueryable<T> input, int clientId) { 
    Type inputType = typeof(T); 
    // Here you can use reflection if you need to: inputType corresponds to the type of T 
    // Create an instance of IQueryable<T>, and return it to the caller. 
} 
+0

我認爲我弄糟了代碼的擴展部分。 – 2012-04-17 14:11:13

0

更改您的簽名,

public static IQueryable<T> LovelyExtension(this T objectType, int clientId) 

public static T LovelyExtension(this T objectType, int clientId) 

public static IQueryable<T> LovelyExtension(this IQuerable<T> objectType, int clientId) 

GetCategoryIds()返回一個IQuerable(這是你把東西付諸LovelyExtension的的objectType,你的回報基於你的原始簽名的類型變成IQuerable>這顯然不符合wha你在追求。

0

我相信你需要在你的客戶端類聲明一個接口,併爲你的擴展方法添加一個constratint。看看這個帖子generic extension method