我正在尝试扩展已经具有返回类型的方法。例如:
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
语句。
答案 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