0

我正在尝试扩展一个已经具有返回类型的方法。例如:

IQueryable<int> GetCategoryIds()

因此,我可以按如下方式使用它:

IQueryable<int> categories = GetCategoryIds();

我目前正在做:

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

这行得通,但我不想这样做Select。我宁愿做一个除了 a 之外的扩展方法,type这样我就可以在扩展方法中使用反射来确定类型等并返回相应的结果。扩展方法类似于:

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

然后我可以使用这个扩展(希望如此):

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

这可能吗?当我尝试它时,我得到了一个错误,因为GetCategoryIds返回类型与扩展方法不同。但是,这适用于Select声明。

4

3 回答 3

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.
}
于 2012-04-17T13:56:30.107 回答
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>,这显然与您所追求的不匹配。

于 2012-04-17T13:56:08.360 回答
0

我相信您将需要在您的客户端类上声明一个接口并为您的扩展方法添加一个约束。看看这个帖子通用扩展方法

于 2012-04-17T13:56:31.273 回答