.net 如何在内部调用显式接口实现方法而不显式强制转换?

j91ykkif  于 2022-12-01  发布在  .NET
关注(0)|答案(7)|浏览(154)

如果我有

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

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

如何在没有显式转换的情况下从AnotherMethod()调用AInterfaceMethod()

mzmfm0qo

mzmfm0qo1#

有很多方法可以在不使用cast运算符的情况下完成此操作。
技巧1:使用“as”运算子,而不要使用转换运算子。

void AnotherMethod()   
{      
    (this as IAInterface).AInterfaceMethod();  // no cast here
}

技巧2:通过本地变量使用隐式转换。

void AnotherMethod()   
{      
    IAInterface ia = this;
    ia.AInterfaceMethod();  // no cast here either
}

技巧三:编写扩展方法:

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!
}
bqjvbblv

bqjvbblv2#

你可以引入一个助手私有属性:

private IAInterface IAInterface => this;

void IAInterface.AInterfaceMethod()
{
}

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

qyswt5oh3#

试过这个,效果很好...

public class AImplementation : IAInterface
{
    IAInterface IAInterface;

    public AImplementation() {
        IAInterface = (IAInterface)this;
    }

    void IAInterface.AInterfaceMethod()
    {
    }

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

pobjuy324#

还有另一种方法(这是Eric的技术#2的衍生产品,如果接口没有实现,也会出现编译时错误)

IAInterface AsIAInterface
     {
        get { return this; }
     }
7eumitmz

7eumitmz5#

你不能,但如果你必须做很多,你可以定义一个方便的助手:
private IAInterface that { get { return (IAInterface)this; } }
无论何时要调用显式实现的接口方法,都可以使用that.method()而不是((IAInterface)this).method()

ygya80vv

ygya80vv6#

还有另一种方式(不是最好的):

(this ?? default(IAInterface)).AInterfaceMethod();
de90aj5v

de90aj5v7#

您不能从方法签名中删除“IAInterface.”吗?

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

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

相关问题