Linq to SQL扩展方法:方法重载,错误

时间:2014-02-13 03:49:04

标签: c# linq linq-to-sql overloading extension-methods

如果答案显而易见,我道歉,但谷歌没有回答(可能是因为我可能没有使用理想的措词)。对于有多个类的用户,我正在尝试重载我创建的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)'   用法。尝试指定类型参数   明确。

3 个答案:

答案 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)