2014-01-10 157 views
4

如何檢查對象的類是否包含mixin?例如:如何檢查對象的類是否在Dart中包含mixin?

class AClass extends Object with MyMixin {} 
class BClass extends Object    {} 

classIncludesMixin(new AClass(), 'MyMixin'); // => true 
classIncludesMixin(new BClass(), 'MyMixin'); // => false 

這個classIncludesMixin()方法應該在什麼情況下才能正常工作?

+0

你真的想用它的名字反映類(混入)?例如,你想使用「MyMixin」而不是運行時類型「MyMixin」?如果你想使用'name'而不是'type',那麼在這種情況下,你必須確定這個類所在的'library',然後比較'name和library'。在某些情況下僅比較名稱可能不正確。 – mezoni

回答

6

您可以簡單地使用類型檢查o is MyMixin(這對於繼承和實現也是如此)。

如果你真的要檢查你必須使用dart:mirrors的混入條款:

bool classIncludesMixin(o, String mixinName) { 
    var c = reflect(o).type; 
    while (c != null) { 
    var m = c.mixin; 
    if (c != m && m.simpleName == new Symbol(mixinName)) return true; 
    c = c.superclass; 
    } 
    return false; 
} 
+0

你是否知道用飛鏢的方式:鏡子?由於'o是MyMixin'也返回true,如果o實現或擴展,當然它本身就是'MyMixin'。 –

+0

我用鏡像示例更新了我的答案。 –

+0

非常感謝@AlexandreArdhuin。看來我一直忽略'mixin' getter。我覺得有趣的是,'classInclusesMixin(new MyMixin(),'MyMixin')'也返回true。 –

相關問題