如果答案显而易见,我道歉,但谷歌没有回答(可能是因为我可能没有使用理想的措词)。对于有多个类的用户,我正在尝试重载我创建的LINQ方法签名;每个签名都需要自己的逻辑。我有以下内容:
public static class myExtension // TODO: Rename.
{
public static IQueryable<TypeA> IsReadableBy<T>(this IQueryable<TypeA> query, User user)
where T : TypeA
{
if (user.foo("argument")) {
return query;
} else if (!user.bar("argument2")) {
return query.Where(q => q.Collection1.Count == 0 && q.Collection2.Count == 0);
} else {
return query.Where(q => q.Collection1.Any(x => x.User.Id == user.Id)
|| q.Collection2.Any(x => x.Group.HasUser(user)));
}
}
}
现在,当我尝试将以下内容添加到MyExtension类时,它会失败:
public static IQueryable<TypeB> IsReadableBy<T>(this IQueryable<TypeB> query, User user)
where T : TypeB
{
if (user.foo("argument") || user.bar("argument2"))
{
return query;
}
else
{
return query.Where(q => q.Collection1.Any(x => x.User.Id == user.Id)
|| q.Collection2.Any(x => x.Group.Users.Any(u => u.User.Id == user.Id)));
}
}
这会打破一切,即使方法签名应该不同。我尝试将新方法添加到自己的类中但没有成功。我怎样才能重载这样的方法?
编辑:我得到的错误就是这个 -
'System.Linq.IQueryable'没有 包含'IsReadableBy'的定义,没有扩展方法 'IsReadableBy'接受第一个类型的参数 'System.Linq.IQueryable'可以 发现(您是否缺少using指令或程序集引用?)
方法的类型参数 “Extensions.ModelExtensions.IsReadableBy(System.Linq.IQueryable, 无法从中推断出Data.Entities.User)' 用法。尝试指定类型参数 明确。
答案 0 :(得分:2)
您不能仅通过约束来重载方法。方法签名(名称和参数)必须不同,约束不是方法签名的一部分。
请参阅Eric Lippert's blog: Constraints are not part of the signature
答案 1 :(得分:1)
这很有效。我不确定你的错误是什么,但我在控制台上得到2和1。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
namespace WpfApplication7
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Class1.foo();
}
}
public class Class1
{
public static void foo()
{
new List<Class2>().IsReadableBy<Class2>();
new List<Class1>().IsReadableBy<Class1>();
}
}
public class Class2
{
}
public static class myExtension // TODO: Rename.
{
public static IQueryable<Class1> IsReadableBy<T>(this IEnumerable<Class1> query)
where T : Class1
{
Console.WriteLine("1");
return null;
}
public static IQueryable<Class2> IsReadableBy<T>(this IEnumerable<Class2> query)
where T : Class2
{
Console.WriteLine("2");
return null;
}
}
}
但是,如果我替换签名以使用T -> IsReadableBy<T>(this IEnumerable<T> query)
,那么您将获得Member with the same signature is already declared
。在这种情况下,由于agentnega的响应更合适......约束不是签名的一部分。
答案 2 :(得分:1)
如果您已经知道类型,为什么需要使用通用方法?只需使用以下方法签名,它应该适合您。
public static IQueryable<TypeB> IsReadable(this IQueryable<TypeB> query, User user)