2013-02-23 2 views
2

Наличие зеркал, возвращающих фьючерсы, резко ограничивает то, что вы можете с ними делать.Dart Mirror API: получение результата вызова отражения

Например,

class ObjectA { 
    methodA(){} 
    methodB(){} 
} 

class DynamicWrapper extends MagicalDynamicWrapper { 
    ObjectA real; 
    Map<String, Function> methods; 
    DynamicWrapper(this.real, this.methods); 
} 

var w = new DynamicWrapper(new ObjectA(), {"methodB" :(){ 'do something' }}); 
w.methodA() // calls ObjectA.methodA 
w.methodB() // calls 'do something' 

Путь я обычно делаю это путем определения noSuchMethod в MagicalDynamicWrapper:

  • что проверит, есть ли метод с таким именем в методах карту, затем назовите ее.
  • , и если его нет, он будет называть «реальный» объект через отражение.

К сожалению, вызов реального объекта всегда будет возвращать будущее. Так что это не сработает.

В какой-то момент можно было получить значение будущего (используя значение getter), но этот геттер больше не доступен.

Мой вопрос:

Есть ли способ, чтобы получить результат отражения вызова синхронно?

В распределенной настройке фьючерсы - это, безусловно, путь. Но в нераспределенной настройке, где доступна вся метаинформация, должно быть возможно получить значение вызова отражения. Я бы сделал огромную разницу для авторов тестовых фреймворков и инструментов построения.

ответ

2

Наличие зеркал, возвращающиеся фьючерсы, безусловно, имеет смысл

Нет, нет (ну, по крайней мере, не для меня :-)). И это, вероятно, будет изменен, см http://dartbug.com/4633#c17

Путь я обычно делаю это путем определения noSuchMethod в MagicalDynamicWrapper, который будет проверять, есть ли метод с таким именем в карте методов, а затем вызвать его, и если их нет, он будет называть «реальный» объект через отражение.

Проверьте документацию InvocationMirror. Вы можете переадресовать вызовы методов с использованием invokeOn метода:

class Proxy { 
    var target; 
    Map<String, Function> overrides; 

    Proxy(this.target, this.overrides); 

    noSuchMethod(invocation) { 
    if (overrides.containsKey(invocation.memberName)) { 
     return overrides[invocation.memberName](); 
    } else { 
     return invocation.invokeOn(target); 
    } 
    } 
} 

Есть ли способ, чтобы получить результат отражения вызова синхронно?

Нет, это не так. Не прямо сейчас. Вы можете пометить http://dartbug.com/4633, если хотите.

+0

Благодарим за отзыв. Метод invokeOn работает в моем случае. Я надеюсь, что API синхронизации синхронизации будет добавлен в ближайшее время. Потому что почти всякая интересная библиотека, которую я думаю о письме, требует этого. –

1

В настоящее время вы можете использовать устаревшийFutureValue (aFuture). Очевидно, по имени они обескураживают его использование, и это в конечном итоге уйдет, но я согласен, что пока мы не получим синхронный зеркальный API, вам абсолютно необходимо что-то подобное.

+0

deprecatedFutureValue работает. Благодарю. –