2017-03-15 77 views
1

我在示例中所看到的代碼:如何檢查交換機/機箱中物體的類型?

if (obj is User) { // do something } 

我想檢查在交換機/例流的對象的類型,並發現該對象的屬性.runtimeType

switch (obj.runtimeType) { 
    case User: 
     print(obj); 
     break; 
} 

這是一個正確的方法來檢查對象的類型?

回答

4

Dart switch語句不支持按類型切換。 您應該使用的if測試,而不是一個序列:

if (obj is User) { 
    print(obj); 
} else if (obj is ...) ... 

我真的,真的建議你從不使用runtimeType任何東西。

它可用於使用dart:mirrors反映對象的類型(但也可以使用reflect(object)反映對象本身)。除此之外,使用runtimeType幾乎總是會導致其他可避免的問題。

你可以用runtimeType返回的Type對象做的唯一事情就是檢查它是否相等。如果你這樣做(就像在上面的開關中那樣),那麼你不能正確處理子類型。如果您的系統中存在User的子類型,例如User是接口並且實現類別不同,或者如果您模擬User進行測試或其他許多原因,那麼該實例將不具有User作爲runtimeType ,並且代碼不會識別它。 或者也許會,因爲runtimeType可以被用戶覆蓋,任何類可以選擇返回User。根據runtimeType進行測試並不能保證該課程實際上是您檢查的課程。

當您比較類型時,應始終使用is,因爲它可以正確處理子類。 子類型替代性是面向對象編程的核心思想之一,所以你可以說如果你使用runtimeType,你可能不會做一個最優的面向對象設計。

(在有些情況下的代碼使用other.runtimeType == MyClassoperator==避免等於一個子類實例避免「重點色」的問題的情況下 - 但它意味着它不可能使一個子類或接口實現(其中包括的嘲笑)類型並讓它通過平等檢查,這是我在共享庫代碼中避免的一個非常微妙的限制,你在自己的應用程序中做什麼,沒有人會依賴,至少只有你的問題:微笑:)。

+0

有一個非常骯髒的黑客,我只會提到的完整性,而不是因爲你應該經常這樣做:'嘗試{扔obj; } on user {print(obj); } SomethingElse {useAsSomethingElse(obj); } on Object {/ * default,需要避免被捕獲。 * /}' – lrn

0

切換字符串的作品。

switchType(Object object) { 
    switch (MirrorSystem.getName(new Symbol(object.runtimeType.toString()))) { 
    case "Animal": 
     print('animal basic'); 
     break; 
    case 'Cat': 
     print('Mouse for cat'); 
     break; 
    } 
}