扩展具有返回类型的方法

时间:2012-04-17 13:49:02

标签: c# extension-methods

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

IQueryable<int> GetCategoryIds()

所以,我可以按如下方式使用:

IQueryable<int> categories = GetCategoryIds();

我现在正在做:

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

这样可行,但我不想这样做Select。我宁愿做一个超出type的扩展方法,所以我可以在扩展方法中使用Reflection来确定类型等,并根据结果返回结果。扩展方法类似于:

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

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

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

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

3 个答案:

答案 0 :(得分: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.
}

答案 1 :(得分: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&gt;这显然不符合你所追求的。

答案 2 :(得分:0)

我相信您需要在客户端类上声明一个接口,并在扩展方法中添加一个constratint。请看一下这篇文章generic extension method