2010-08-27 54 views
3

我覺得這應該是非常可能的。確定一個類是否實現了一個接口而不引用它

我有一個接口,我們稱之爲IJerry。現在,我在變量x中有一個類。這個類完全實現了IJerry。事情是,那個班從來沒有提到IJerry。它只是發生與IJerry擁有完美兼容的簽名。

有意義嗎?假設您創建一個名爲MyClass的類實現INotifyPropertyChanged。然後你從類中刪除「MyClass:INotifyPropertyChanged」聲明,但是你在類中放置了實現。

有沒有辦法確定類是否「實現」了一個接口,即使它沒有明確的引用它?

+1

C#不支持鴨子打字:http://en.wikipedia.org/wiki/Duck_typing – 2010-08-27 15:21:09

+2

@Kirk,檢查鏈接中包含的信息。 – 2010-08-27 15:24:33

+0

@安東尼,哦,我明白了。該文章提到使用**動態**關鍵字作爲替代品。國際海事組織,這不是「鴨子打字」,因爲它不提供一般操作滿足該合同類型的「類」的手段。它只是允許你「嘗試」調用該方法。 – 2010-08-27 15:54:58

回答

7

不容易。

你將不得不使用反射來讀取接口領域,方法和屬性,然後檢查類有他們(再次使用反射)

另外,如果你使用的是C#4,你可能會忘記IJerry,並將MyClass放入一個動態變量中,然後您在運行時找出C#調用方法。

+0

織補。我希望這是可能的。 – 2010-08-27 20:50:15

1

您將不得不使用反射來查看x是否具有與IJerry上的方法相匹配的方法。真正的問題是,你將如何處理答案?在版本4之前,C#不支持「鴨子打字」,因此爲了在需要使用IJerry的情況下使用您的類,您必須編寫適配器代碼。

+0

C#4可以做動態輸入。反射的方法也可以被調用。 – 2010-08-27 15:29:49

2

實現接口比實現目標要多得多。首先,實現方法是虛擬的,即使您不使用該關鍵字。實際上,您不允許使用該關鍵字。另一方面,編譯器重新排列方法以匹配接口的方法表格佈局。從聲明中刪除繼承的接口保證使結果不兼容。這些方法將不再是虛擬的。

你正在追求的是所謂的'動態調度'。在DLR中實施並集成到.NET 4.0和C#4.0語言中。重新制定System.Reflection代碼並使其高效是一項重大任務。

相關問題