在子类中重载的父类上创建的调用扩展方法
我的代码如下,其中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");
}
}
如果你想调用扩展方法,你应该投并把它从基类:
((WebServiceSender)d).ExtTest("abc");
而且你当然可以把它从你的扩展类明确:
util.ExtTest(d, "tra");
而且我同意评论和Jon Skeet。你需要这个实际上是一种代码味道,并且使你的代码不可读。
那工作。谢谢 –
@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");
或者,更好的,你可以让他们不冲突重命名或者您的扩展方法或您的实例方法 - 这将使它更清晰,以人阅读其中你想调用的代码。
但是,然后使用对象“d”,我不能从子类调用d.ExtTest(“abc”)。我应该可以从单个对象调用这两种方法 –
@GufranKhan:你应该说这就是你想要的。你只描述想要调用扩展方法...将编辑,但请尝试在未来更清晰。 –
对不起,在最后时刻添加了该问题。感谢虽然:) –
你必须调用它,仿佛它是一个常规的静态方法,而不是调用它,就好像它是一个实例方法。当同时存在扩展方法和编译器找到的同名实例方法时,实例方法总是“获胜”。
这是不好的设计,只是要求麻烦。以适当的方式命名您的方法。 – CyberDude