我在C#模块中有这个代码:
if (customer is IBuyer) { customer.WaiveServiceFee(); }
只要客户是实施IBuyer的对象,此编译就可以了。但是使用条件的整个想法是测试客户对象是否实现了IBuyer。如果没有,我得到一个编译时错误,客户不包含WaiveServiceFee的定义(WaiveServiceFee是由IBuyer实现产生的方法 - 当然,它不是客户类的一部分)。
我对C#不太熟悉,知道如何应用上面的逻辑在运行时调用WaiveServiceFee并使程序可编译?
谢谢。
答案 0 :(得分:7)
改为使用as operator
:
var buyer = customer as IBuyer;
if(buyer != null)
buyer.WaiveServiceFee();
如果customer
未实现IBuyer
,那么buyer
将为空。您可以轻松检查该值是否为null
并调用您的方法,如果它是在编译时,作业buyer
将被视为IBuyer
,因此您可以在没有编译时错误的情况下调用您的方法。
答案 1 :(得分:1)
Selman22的解决方案是正确的。另一种解决方案是插入一个演员:
if (customer is IBuyer)
((IBuyer)customer).WaiveServiceFee();
然而,一些程序员认为这有点不优雅。无论是有效还是常见于生产代码中。