如果我有
public class AImplementation:IAInterface
{
void IAInterface.AInterfaceMethod()
{
}
void AnotherMethod()
{
((IAInterface)this).AInterfaceMethod();
}
}
如果没有明确的投射,如何从AInterfaceMethod()
拨打AnotherMethod()
?
答案 0 :(得分:65)
许多答案说你做不到。他们是不正确的。如果不使用强制转换操作符,有很多方法可以做到这一点。
技术#1:使用“as”运算符而不是强制转换运算符。
void AnotherMethod()
{
(this as IAInterface).AInterfaceMethod(); // no cast here
}
技巧#2:通过局部变量使用隐式转换。
void AnotherMethod()
{
IAInterface ia = this;
ia.AInterfaceMethod(); // no cast here either
}
技巧#3:编写扩展方法:
static class Extensions
{
public static void DoIt(this IAInterface ia)
{
ia.AInterfaceMethod(); // no cast here!
}
}
...
void AnotherMethod()
{
this.DoIt(); // no cast here either!
}
技巧#4:介绍帮手:
private IAInterface AsIA => this;
void AnotherMethod()
{
this.AsIA.IAInterfaceMethod(); // no casts here!
}
答案 1 :(得分:9)
您可以引入帮助私有财产:
private IAInterface IAInterface => this;
void IAInterface.AInterfaceMethod()
{
}
void AnotherMethod()
{
IAInterface.AInterfaceMethod();
}
答案 2 :(得分:7)
试过这个并且它有效......
public class AImplementation : IAInterface
{
IAInterface IAInterface;
public AImplementation() {
IAInterface = (IAInterface)this;
}
void IAInterface.AInterfaceMethod()
{
}
void AnotherMethod()
{
IAInterface.AInterfaceMethod();
}
}
答案 3 :(得分:2)
另一种方式(这是Eric的技术#2的衍生产品,如果没有实现接口,也会产生编译时错误)
IAInterface AsIAInterface
{
get { return this; }
}
答案 4 :(得分:0)
你不能,但如果你必须做很多事情,你可以定义一个方便助手:
private IAInterface that { get { return (IAInterface)this; } }
每当您想要调用明确实现的接口方法时,您可以使用that.method()
代替((IAInterface)this).method()
。
答案 5 :(得分:0)
另一种方式(不是最好的):
(this ?? default(IAInterface)).AInterfaceMethod();
答案 6 :(得分:-3)
你不能只删除“IAInterface”。从方法签名?
public class AImplementation : IAInterface
{
public void AInterfaceMethod()
{
}
void AnotherMethod()
{
this.AInterfaceMethod();
}
}