2013-06-28 81 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