2012-04-17 122 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