2012-09-21 1 views
0

Если у меня есть класс с определенным определителем, как мне ссылаться на сгенерированный метод как функцию из экземпляра этого класса. Спецификации рода предполагает, что это будет идентификатор переменной + «=» (кажется ненормальным), но это не разобратьВ Dart что такое сгенерированное имя для метода сеттера?

Так, например:.

class Bar { 

    set foo(int value) { 
    //whatever 
    } 
} 

typedef F(int value); 

void main() { 
    F f = new Bar().foo=; //Fails, but what should this be?? 
    f(5); 
} 

ответ

2

сеттер называется foo= но это не то, что вы можете ссылаться на то, как вы хотите, даже глядя на дротиком:.. отражает MethodMirror (зеркало для методов объекта, включая сеттеры) не имеет возможности ссылаться на него вы можете легко переписать как:

class Bar { 

    set foo(int value) { 
    //whatever 
    } 
} 

typedef F(int value); 

void main() { 
    Bar b = new Bar(); 
    F f = (int value) => b.foo = value; 
    f(5); 
} 
+0

Вы можете вызвать сеттер с зеркалами с помощью метода MethodMirror.invoke(). Думаю, вам нужно использовать «set:» префикс все еще, чтобы получить зеркало. –

+0

Эй, Джастин, глядя на: http://code.google.com/p/dart/source/browse/branches/bleeding_edge/dart/lib/mirrors/mirrors.dart?r=10918 Я не вижу метод invoke в MethodMirror. В ObjectMirror есть один, но он имеет очень отличную подпись, чем F (значение int) и поэтому не может быть присвоен F. – Cutch

+0

К сожалению, вы правы. Это на ObjectMirror, и похоже, что теперь есть SetField(). У него не будет подписи f (int v), потому что он должен обрабатывать вызов любого метода, поэтому он больше похож на noSuchMethod(). Кроме того, вы не можете закрывать методы через зеркальную систему. Это было бы потрясающе. Возможно, если экземпляр InstanceMirror.hasReflectee верен, он может позволить вам захватить участников. –