相关疑难解决方法(0)

如何覆盖现有的扩展方法

我想用自己的方法替换.NET或ASP MVC框架中包含的扩展方法.

public static string TextBox(this HtmlHelper htmlHelper, string name)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

可能吗?我无法使用override或new关键字.

c# asp.net-mvc

59
推荐指数
3
解决办法
3万
查看次数

你什么时候使用扩展方法,分机.方法与继承?

我们开始使用C#(.NET 3.0),我想知道你们是如何使用扩展方法的?你什么时候使用它们?

此外,如果您还列出了使用它们的所有黑暗先决条件,我将不胜感激.

.net c#

48
推荐指数
5
解决办法
2万
查看次数

如果我将一个IQueryable转换为IEnumerable,那么调用一个Linq扩展方法,该实现被调用?

考虑以下代码:

IQueryable<T> queryable;

// something to instantiate queryable

var enumerable = (IEnumerable<T>) queryable;

var filtered = enumerable.Where(i => i > 3);
Run Code Online (Sandbox Code Playgroud)

在最后一行中,调用哪个扩展方法?

IEnumerable<T>.Where(...)吗?或者会IQueryable<T>.Where(...)被调用,因为实际的实现仍然显然是可查询的?

据推测,理想的是可以调用IQueryable版本,就像普通多态将始终使用更具体的覆盖一样.

在Visual Studio中,当我右键单击Where方法并"转到定义"时,我被带到IEnumerable版本,从视觉角度来看这是有意义的.

我主要担心的是,如果在我的应用程序的某个地方,我使用Linq到NHibernate来获取Queryable,但是我使用一个使用更通用的IEnumerable签名的接口传递它,我将失去延迟数据库执行的奇迹!


编辑:事实证明,正如Iridium指出的那样,它是被调用的Enumerable版本

public class Program
    {
        static void Main(string[] args)
        {
            var myString2 = new MyString2();
            var myString = (MyString)myString2;
            Console.WriteLine(myString.Method());
            Console.ReadLine();
        }
    }

    public class MyString {}

    public class MyString2 : MyString {}

    public static class ExtensionMethods
    {
        public static string Method(this MyString instance)
        {
            return "MyString method";
        } …
Run Code Online (Sandbox Code Playgroud)

c# linq extension-methods

15
推荐指数
1
解决办法
1748
查看次数

扩展方法是否应该有前缀?

根据我读到的有关扩展方法的内容,如果基类决定添加与扩展名相同的方法,则会遇到问题.对于特定的类,通常不难选择名称以避免冲突,但是可以向接口添加扩展方法,这会增加冲突的无限可能性.

在Objective-C(及其版本,类别)中,通​​过在每个方法之前添加前缀来避免此问题.我知道我们可以在命名空间中定义扩展方法,以便我们可以控制它们是否被导入,但这只能解决扩展方法之间的冲突问题,而不是扩展方法和基类之间的冲突.

更新:

实际上没有人提到这一点,但扩展方法并不是虚拟的.这意味着如果你可以在接口i上使用i.myExtension(),那么它将始终调用接口类方法,因此不会调用子类方法(可能具有不同的意图).因此,总的来说,使用扩展方法是非常安全的.

c#

6
推荐指数
3
解决办法
543
查看次数

标签 统计

c# ×4

.net ×1

asp.net-mvc ×1

extension-methods ×1

linq ×1