2013-06-28 115 views
2

我們的商店有一個核心庫,提供一個擴展方法First,它實際上是Linq的FirstOrDefault所做的。在我們使用Linq之前,我們的方法正在使用中。 Linq參考文件稍後添加,這樣做不會導致任何問題。使用該核心的應用程序能夠繼續調用First並使我們的方法與Linq同名。最近這個變化發生在我們的Core的構建變化超過了一個月的時間。現在它將First解析爲Linq的版本,而不是定製版本。.NET擴展方法衝突解決類似命名的方法?

延伸方法的要點是你不符合他們的要求。你叫

PeopleTable.Rows.OfType(Of DataRow)().First 

,而不是

utlCore.First(PeopleTable.Rows.OfType(Of DataRow)()) 

所以其不切實際的重溫代碼企圖資格的命名空間。我知道,複製核心以消除衝突並簡單地使用FirstOrDefault是有道理的,但這是一個更大和更晚的待辦事項。

很明顯,這些擴展方法如何解決有一些優先級。我並不知道會發生什麼改變,導致這種優先順序失控。你會從哪裏開始尋找?什麼會造成這種情況?

+4

「我們的方法在Linq之前就已經在使用了 - 作爲擴展方法,這有多可能?擴展方法與LINQ同時引入... –

+3

您需要在實際使用案例中提供First'方法和編譯時類型的簽名,以便我們真正提供有關重載解決步驟。 –

+0

您在更改期間是否在覈心中添加了對LINQ的引用?而且,在消費代碼的相同範圍內引用了LINQ和Core,如果是這樣,你爲什麼試圖在相同的消費者範圍內交換它們,以免引起麻煩。 –

回答

0

我會想你「使能」通過「ExtensionAttribute黑客」,這是你怎麼會有擴展方法,而不是LINQ擴展方法...

至於爲什麼你看到這個問題現在,你可能已經包含在某個地方,在新代碼:

using System.Linq; 

由於帶來System.Linq.Enumerable爲範圍,現在你有你的First和LINQ的First之間的模糊 - 你可以八九不離十這個命名空間別名控制。 ..這裏' SA一次性例如:

using System; 
using System.Collections.Generic; 
// don't add this, lest you bring it in 
//using System.Linq; 
using Linq = System.Linq.Enumerable; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var values = new List<int>(Linq.Range(0, 10)); 
      var useLinqFirst = Linq.First(values); 
      Console.WriteLine("LINQ First(): {0}", useLinqFirst); 
      var useMyFirst = values.First(); 
      Console.WriteLine("My First(): {0}", useMyFirst); 
      Console.ReadLine(); 
     } 
    } 

    public static class Ext 
    { 
     public static T First<T>(this IEnumerable<T> src) 
     { 
      Console.WriteLine("Using my First!"); 
      var e = src.GetEnumerator(); 
      while (e.MoveNext()) 
      { 
       return e.Current; 
      } 
      return default(T); 
     } 
    } 
} 

老實說,我只是改進,以適應使用LINQ的First \ FirstOrDefault - 更安全,從長遠來看,因爲某個地方,有人會忘記他們不能包括LINQ的命名空間,並你會回到相同的情況。

+0

調查那個可能性... – Mario

+0

請注意,如果你這樣做,你不能使用任何LINQ mentods(甚至是'First'以外的那些)作爲擴展方法。這可能是一個......問題。 – Servy

+0

@Servy絕對 - 因此建議只咬硬幣並進行改造。這種方法在任何意義上都是不可取的。 – JerKimball