2012-08-28 37 views
3

我在看這段由別人寫的代碼,我想知道它什麼時候會評估爲真。基本上,它說someType是someOtherType的一個實例。它有意義嗎?到目前爲止,我已經嘗試過:何時是obj.GetType()。IsInstanceOfType(typeof(MyClass))是否爲真?

derivedClass.GetType().IsInstanceOfType(typeof(BaseClass)) 

baseClass.GetType().IsInstanceOfType(typeof(DerivedClass)) 

myClass.GetType().IsInstanceOfType(typeof(MyClass)) 

而且他們都評價爲false。

任何幫助表示讚賞。

+0

你可能要重構和使用'is'運營商的一個實例,它returs如此。 –

+1

'typeof'返回一個對象'System.Type',這就是爲什麼它總是假的。將其更改爲'derivedClass是BaseClass'好得多。 –

回答

4

每個那些3線將返回true 如果(derivedClassbaseClassmyClass分別)所涉及的對象是object的實例,或者未記錄的RuntimeType對象(注意Type是抽象的),因此,例如以下將導致真實的陳述:

var myObject = new object(); 
myObject.GetType().IsInstanceOfType(typeof(Console)); 

myObject = typeof(Object); 
myObject.GetType().IsInstanceOfType(typeof(Console)); 

注意,使用的類型(在這種情況下Console)並不重要,對語句的結果沒有影響。

爲什麼?

IsInstanceOfType的文件告訴我們,如果傳遞的對象是當前類型的實例,它將返回true,因此,例如以下語句將返回true,如果myForm是從Form派生的類,否則會返回false。

typeof(Form).IsInstanceOfType(myForm); 

在你的情況myForm其實typeof(BaseClass),這是無證型RuntimeType(從Type派生)的,所以你只打算讓true返回如果無證類型發生從提供給派生類型 - 這不可能是所需的行爲。

應該改用什麼?

你是什麼之後可能是is keword,如果提供的對象是給定類型

derivedClass is BaseClass 
baseClass is DerivedClass 
myClass is MyClass 
+0

我相信你會混淆IsAssignableFrom和IsInstanceOfType。你的代碼是問「這個類型的對象類型Type的一個實例嗎?」這將永遠是真實的。不能總是使用'​​is'關鍵字,因爲您有時有一個Type對象。 –

0

當您調用GetType()的對象是作爲IsInstanceOfType()方法的參數的參數傳遞的System.Type對象的實例時,這是正確的。

0

IsInstanceOfType確定指定的對象是否是當前類型的實例。

樣品:IsInstanceOfType(O)

如果當前類型是在用○表示的對象的繼承層次結構,或者如果當前類型是被O支持的接口。假,如果沒有這些條件不能滿足,或者如果o爲null,或者如果當前類型爲開放式泛型類型

6

IsInstanceOfType()檢查實例你通過它是否是你把它稱爲類型的實例上。

您正在將System.Type實例傳遞給IsInstanceOfType()。只有在typeof(Type)或它的一個基類上調用它時,情況纔會如此。

+0

你的意思是'myClass.GetType()。IsInstanceOfType(typeof(Type))'? – user1486691

+0

@ user1486691:編號'typeof(Type).IsInstanceOfType(anyType)'將爲任何'Type'實例返回true。 'IsInstanceOfType'不應該是一個類型。 – SLaks

+0

typeof(DateTime).IsInstanceOfType(new DateTime()):true – simaglei

2

Type.IsInstanceOf documentationType.IsInstanceOfType(o)返回「如果當前類型是在由Ó表示的對象的繼承層次結構,或者如果當前類型ö支撐的接口。 「

在上面的例子中,Type是由GetType()返回的類型,所以它是最左邊的對象的類型。對象otypeof(BaseClass),其類型爲Type。當前TypeDerivedClass,對象otypeof(BaseClass)o的類型是Type

將其插入文檔。它返回「如果DerivedClass是在Type繼承層次。」

這很少是真的。

筆者幾乎可以肯定預期typeof(BaseClass).IsInstanceOfType(derivedClass),這是更容易寫成derivedClass is BaseClass

相關問題