2013-06-18 18 views
2

假設我們有兩個實現公共接口的類。從接口實例中提取數據類型信息

public interface IContract 
{ 
    int Type { get; } 
} 

public class XClass : IContract 
{ 
    public int Type { get; set; } 
    public int X { get; set; } 
} 

public class YClass : IContract 
{ 
    public int Type { get; set; } 
    public int Y { get; set; } 
} 

現在,如你所知,當我們指定一個類來實現的接口,該接口實例裏面含有盒裝分配類的所有數據。

IContract ic = new XClass(); 

應該有一種方法來檢測接口變量ic中值的數據類型。

如果(IC包含XClass數據類型)然後... 如果(IC包含YClass數據類型)然後...

我會很高興,如果有人能幫助我,以檢測分配給接口實例的數據類型。謝謝。

+6

請注意,如果您需要進行此類檢查,則可能是您的接口/類的重構將有助於使代碼更清晰。聲明接口類型的變量表示您只需*該接口的方法和屬性。如果你需要根據實現類型進行專門化,最好向接口本身添加一個新方法,這些類可以按照他們認爲合適的方式實現。 – dlev

+0

感謝dlev​​的提示 – Jahan

回答

4

你試過:

if (ic is XClass) 

您可以使用「是」關鍵字來確定類。然後總是有.GetType(),但那不是那麼幹淨。

if (ic.GetType() == typeof(XClass)) 

此外,值得一提的是as關鍵字。如果你想從當前對象申報的新對象,保證它是一個特定的類:

var d = ic as XClass 

如果ic不是XCLass,它將設置dnull

+0

對,'is'操作符非常有用。謝謝Richard。 – Jahan

+0

這很有用,但不正確。向接口添加方法是處理這種情況的方法。如果你沒有擁有這個接口,那麼用一個'IContract' getter創建另一個接口,多餘的一塊就是要走的路。 – Crisfole

+0

@ChristopherPfohl我並不同意你的看法,但這並不能回答這個問題。此外,'is'關鍵字對於理智檢查,過濾(.ForEach(c => c是XClass))和其他用途來說非常重要。方法並不總能解決問題。 – Richard

1

'is'運算符用於在運行時動態獲取對象的類型,'as'用於在類型之間鍵入類型轉換。

上面的例子會對你有所幫助。

雖然如果你的類的實現是相同的,不管類型如何,那麼你應該使用泛型。

+0

感謝您的評論 – Jahan

1
if (ic.GetType().Equals(typeof(XClass))) 
{ //do something }