我在示例中所看到的代碼:如何檢查交換機/機箱中物體的類型?
if (obj is User) { // do something }
我想檢查在交換機/例流的對象的類型,並發現該對象的屬性.runtimeType
:
switch (obj.runtimeType) {
case User:
print(obj);
break;
}
這是一個正確的方法來檢查對象的類型?
我在示例中所看到的代碼:如何檢查交換機/機箱中物體的類型?
if (obj is User) { // do something }
我想檢查在交換機/例流的對象的類型,並發現該對象的屬性.runtimeType
:
switch (obj.runtimeType) {
case User:
print(obj);
break;
}
這是一個正確的方法來檢查對象的類型?
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 == MyClass
在operator==
避免等於一個子類實例避免「重點色」的問題的情況下 - 但它意味着它不可能使一個子類或接口實現(其中包括的嘲笑)類型並讓它通過平等檢查,這是我在共享庫代碼中避免的一個非常微妙的限制,你在自己的應用程序中做什麼,沒有人會依賴,至少只有你的問題:微笑:)。
切換字符串的作品。
switchType(Object object) {
switch (MirrorSystem.getName(new Symbol(object.runtimeType.toString()))) {
case "Animal":
print('animal basic');
break;
case 'Cat':
print('Mouse for cat');
break;
}
}
有一個非常骯髒的黑客,我只會提到的完整性,而不是因爲你應該經常這樣做:'嘗試{扔obj; } on user {print(obj); } SomethingElse {useAsSomethingElse(obj); } on Object {/ * default,需要避免被捕獲。 * /}' – lrn