2014-02-13 86 views
1

我很抱歉,如果答案很明顯,但Google沒有找到答案(可能是因爲我可能沒有使用理想的措辭)。我試圖重載我創建的LINQ方法簽名,用於多個類的用戶;每個簽名都需要自己的邏輯。我有以下幾點:Linq to SQL擴展方法:方法重載,錯誤

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」的可能是 實測值(是否缺少使用指令或程序集引用?)

的類型參數方法 「Extensions.ModelExtensions.IsReadableBy(System.Linq.IQueryable, Da ta.Entities.User)'不能從 的用法中推斷出來。嘗試明確指定類型參數 。

+0

你會得到什麼錯誤? – thepirat000

+1

如果你已經知道類型,爲什麼你需要有通用的方法? '公共靜態IQueryable IsReadable(這個IQueryable 查詢,用戶用戶)'爲你工作? – wdosanjos

+0

我認爲沒有人注意到這裏有一個* TaskA * **和** a * TypeA *類...(與* TaskB *和* TypeB *相同) – thepirat000

回答

1

如果您已經知道該類型,爲什麼您需要具有通用方法?只需使用下面的方法簽名,它應該適合你。

public static IQueryable<TypeB> IsReadable(this IQueryable<TypeB> query, User user) 
1

This Works。我不確定你的錯誤是什麼,但我在控制檯上得到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的迴應更合適......約束不是簽名的一部分。

+0

請注意,在問題中有* TaskA *和* TypeA *(與* TaskB *和* TypeB *相同) – thepirat000

+0

Yah,我認爲OP在代碼中實際上發佈了一些錯別字... –

+0

我也編輯過我的答案涵蓋了另一個可能的錯字案例... –