在子类中重载的父类上创建的调用扩展方法

问题描述:

  • 我的代码如下,其中WebServiceSender是父类。在子类中重载的父类上创建的调用扩展方法

  • 我已经添加扩展方法将其称为“ExtTest”。

  • 我有一个子类“ChildWebServiceSender”继承 WebServiceSender。

  • 在我的孩子班级为有两个重载方法我有同样的签名 扩展方法的方法,public WebServiceSender ExtTest(string something)

现在创建子类的对象后,我获得智能。但我总是可以从Child类调用ExtTest,但不能使用Extension方法。

如何调用扩展方法ExtTest?

public class WebServiceSender : IMessageSender 
{ 
    public void SendMessage(string subject, string body) 
    { 
     Console.WriteLine("Web Service\n{0}\n{1}\n", subject, body); 
    } 
} 
public static class util 
{ 
    public static WebServiceSender ExtTest(this WebServiceSender abc, string something) 
    { 
     Console.WriteLine("I am into extension"); 
     return new WebServiceSender(); 
    } 
} 

public class ChildWebServiceSender : WebServiceSender 
{ 
    public WebServiceSender ExtTest(string something) 
    { 
     Console.WriteLine("I am in instance"); 
     return new WebServiceSender(); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     ChildWebServiceSender d = new ChildWebServiceSender(); 
     d.ExtTest("abc"); 
    } 
} 
+0

这是不好的设计,只是要求麻烦。以适当的方式命名您的方法。 – CyberDude

如果你想调用扩展方法,你应该投并把它从基类:

((WebServiceSender)d).ExtTest("abc"); 

而且你当然可以把它从你的扩展类明确:

util.ExtTest(d, "tra"); 

而且我同意评论和Jon Skeet。你需要这个实际上是一种代码味道,并且使你的代码不可读。

+0

那工作。谢谢 –

+0

@GufranKhan如果这样工作,你可以upvote答案并将其标记为解决方案:) –

我如何可以调用扩展方法ExtTest?

实例方法总是比扩展方法更受欢迎 - 编译器只在其他所有事情失败后才检查扩展方法。

在这种情况下,最简单的方法就是使用WebServiceSender类型,而不是一个变量:

WebServiceSender d = new ChildWebServiceSender(); 
d.ExtTest("abc"); // This will call the extension method 

d执行时类型并不重要 - 只有编译时类型。

如果您需要调用从ChildWebServiceSender方法以及,你可以使用两个变量,指的是同一个对象:

ChildWebServiceSender child = new ChildWebServiceSender(); 
WebServiceSender baseRef = child; 
child.ExtTest("abc"); // This will call the child instance method 
baseRef.ExtTest("abc"); // This will call the extension method 

(您可以使用强制替代,当然 - 我想这将更清晰阅读主要的一点是要作为目标的方法调用WebServiceSender类型的表达式)

或者你可以只调用该方法作为常规静态方法:。

// TODO: Rename "util" to follow .NET naming conventions 
util.ExtTest(d, "abc"); 

或者,更好的,你可以让他们不冲突重命名或者您的扩展方法或您的实例方法 - 这将使它更清晰,以人阅读其中你想调用的代码。

+0

但是,然后使用对象“d”,我不能从子类调用d.ExtTest(“abc”)。我应该可以从单个对象调用这两种方法 –

+0

@GufranKhan:你应该说这就是你想要的。你只描述想要调用扩展方法...将编辑,但请尝试在未来更清晰。 –

+0

对不起,在最后时刻添加了该问题。感谢虽然:) –

你必须调用它,仿佛它是一个常规的静态方法,而不是调用它,就好像它是一个实例方法。当同时存在扩展方法和编译器找到的同名实例方法时,实例方法总是“获胜”。