2014-02-26 73 views
0

我有這樣的代碼在我的C#模塊:接口檢測反射

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

編譯沒有問題,只要客戶是實現IBuyer的對象。但是使用條件的整個想法是測試客戶對象是否實現了IBuyer。如果它沒有,我得到一個編譯時錯誤,客戶不包含WaiveServiceFee的定義(WaiveServiceFee是由IBuyer實現產生的方法 - 當然,它不是客戶類的一部分)。

我對C#不熟悉,不知道如何在運行時使用上面的邏輯來調用WaiveServiceFee,並且使程序可編譯?

謝謝。

回答

7

使用as operator代替:

var buyer = customer as IBuyer; 
if(buyer != null) 
    buyer.WaiveServiceFee(); 

如果customer沒有實現IBuyer,然後buyer將null.You可以很容易地檢查值是否是null與否,並調用你的方法,如果它不是null.After分配buyer將在編譯時被視爲IBuyer,因此您將能夠在沒有編譯時錯誤的情況下調用您的方法。

+0

考慮命名臨時變量'buyer'而不是混淆的縮寫'cust'。 –

+0

@EricLippert改變:) –

1

Selman22的解決方案是正確的。另一種解決方案是插入一個演員陣容:

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

然而,這被一些程序員認爲是有點不雅觀。可以工作並且通常在生產代碼中看到。

+0

我曾經認爲這是不雅的。不過,我現在經常使用它,並發現代碼非常乾淨。如果你不確定你的對象是否實現了一個接口,那麼你在程序中有一個真正的決定點。 –

+0

我也喜歡這種方式,實際上我覺得它比上面接受的答案更「優雅」。然而,我不熟悉As關鍵字。 – Jazimov

+0

我剛剛意識到這裏的優點是你不需要創建一個新的變量。這可能會吸引一些讀者。 – Jazimov