界面检测反射

时间:2014-02-26 03:39:24

标签: c# reflection interface

我在C#模块中有这个代码:

if (customer is IBuyer) { customer.WaiveServiceFee(); }

只要客户是实施IBuyer的对象,此编译就可以了。但是使用条件的整个想法是测试客户对象是否实现了IBuyer。如果没有,我得到一个编译时错误,客户不包含WaiveServiceFee的定义(WaiveServiceFee是由IBuyer实现产生的方法 - 当然,它不是客户类的一部分)。

我对C#不太熟悉,知道如何应用上面的逻辑在运行时调用WaiveServiceFee并使程序可编译?

谢谢。

2 个答案:

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

然而,一些程序员认为这有点不优雅。无论是有效还是常见于生产代码中。