如果我有
public class AImplementation:IAInterface { void IAInterface.AInterfaceMethod() { } void AnotherMethod() { ((IAInterface)this).AInterfaceMethod(); } }
如何在没有显式转换的情况下从AnotherMethod()调用AInterfaceMethod()?
AnotherMethod()
AInterfaceMethod()
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! }
bqjvbblv2#
你可以引入一个助手私有属性:
private IAInterface IAInterface => this; void IAInterface.AInterfaceMethod() { } void AnotherMethod() { IAInterface.AInterfaceMethod(); }
qyswt5oh3#
试过这个,效果很好...
public class AImplementation : IAInterface { IAInterface IAInterface; public AImplementation() { IAInterface = (IAInterface)this; } void IAInterface.AInterfaceMethod() { } void AnotherMethod() { IAInterface.AInterfaceMethod(); } }
pobjuy324#
还有另一种方法(这是Eric的技术#2的衍生产品,如果接口没有实现,也会出现编译时错误)
IAInterface AsIAInterface { get { return this; } }
7eumitmz5#
你不能,但如果你必须做很多,你可以定义一个方便的助手:private IAInterface that { get { return (IAInterface)this; } }无论何时要调用显式实现的接口方法,都可以使用that.method()而不是((IAInterface)this).method()。
private IAInterface that { get { return (IAInterface)this; } }
that.method()
((IAInterface)this).method()
ygya80vv6#
还有另一种方式(不是最好的):
(this ?? default(IAInterface)).AInterfaceMethod();
de90aj5v7#
您不能从方法签名中删除“IAInterface.”吗?
public class AImplementation : IAInterface { public void AInterfaceMethod() { } void AnotherMethod() { this.AInterfaceMethod(); } }
7条答案
按热度按时间mzmfm0qo1#
有很多方法可以在不使用cast运算符的情况下完成此操作。
技巧1:使用“as”运算子,而不要使用转换运算子。
技巧2:通过本地变量使用隐式转换。
技巧三:编写扩展方法:
技巧4:介绍帮手:
bqjvbblv2#
你可以引入一个助手私有属性:
qyswt5oh3#
试过这个,效果很好...
pobjuy324#
还有另一种方法(这是Eric的技术#2的衍生产品,如果接口没有实现,也会出现编译时错误)
7eumitmz5#
你不能,但如果你必须做很多,你可以定义一个方便的助手:
private IAInterface that { get { return (IAInterface)this; } }
无论何时要调用显式实现的接口方法,都可以使用
that.method()
而不是((IAInterface)this).method()
。ygya80vv6#
还有另一种方式(不是最好的):
de90aj5v7#
您不能从方法签名中删除“IAInterface.”吗?