.NET扩展方法与命名方法冲突解决?

时间:2013-06-28 16:57:34

标签: c# .net vb.net

我们的商店有一个核心库,提供了一个实际执行Linq First所做的扩展方法FirstOrDefault。在我们使用Linq之前,我们的方法一直在使用。 Linq引用稍后添加,这样做不会导致任何问题。使用该核心的应用程序能够继续调用First并使我们的方法与Linq同名。最近,当我们的Core构建的变化超过一个月的时间时,这种情况发生了变化。现在它将First解析为Linq的版本,而不是自定义版本。

扩展方法的一点是你没有限定它们。你打电话

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

而不是

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

因此,重新访问代码以尝试限定命名空间是不切实际的。我知道复制核心以消除冲突并简单地使用FirstOrDefault是有意义的,但这是一个更大的后来的待办事项。

显然,对于如何解决这些扩展方法存在一些优先级。我不知道会发生什么变化导致这个优先顺序失败。你会从哪里开始寻找?什么可能导致这种情况?

1 个答案:

答案 0 :(得分:0)

我猜你通过“ExtensionAttribute hack”启用了“启用”扩展方法,这就是扩展方法而不是LINQ ...

至于为什么你现在看到这个问题,你可能会在新代码中包含这个问题:

using System.Linq;

由于这会将System.Linq.Enumerable纳入范围,现在您的First和Linq First之间存在歧义 - 您可以使用命名空间别名 sorta 来控制它。这是一个一次性的例子:

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命名空间,并且你会回到同样的境地。