如何在内部调用显式接口实现方法而不进行显式转换?

时间:2009-12-08 18:19:01

标签: c# .net

如果我有

public class AImplementation:IAInterface
{
   void IAInterface.AInterfaceMethod()
   {
   }

   void AnotherMethod()
   {
      ((IAInterface)this).AInterfaceMethod();
   }
}

如果没有明确的投射,如何从AInterfaceMethod()拨打AnotherMethod()

7 个答案:

答案 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();
   }
}