2012-10-18 1 views

답변

2

현재 아직 존재하지 않는 필드를 설정할 수있는 것은 없습니다. mirror API은 이미 존재하는 필드를 설정하는 데 사용할 수 있으며 결국에는 새로운 필드를 동적으로 정의 할 수 있도록 확장 될 수 있습니다.

+0

차가움. 미러 API는 내가 원하는 것을하도록해야한다고 생각합니다. 나는. 클래스와 식별자를 기반으로 기본 인스턴스를 생성 한 다음 리플렉션을 사용하여 멤버를 채 웁니다. 감사! –

+0

안녕하세요 @ 짐벨턴 (JimBelton)은 미러가 실제로는 현재 VM에 불과하다는 점에 유의하십시오. 클라이언트 또는 서버 앱을 제작하고 있습니까? –

+0

Seth : 서버와 클라이언트 모두에서 사용할 수있는 기능에 대해 다트에 관심이 있습니다. 내가 거울에 관심이있는 부분은 파싱과 지속성입니다. 클라이언트 측은 필수는 아니지만 서버 측에서는 구문 분석을 수행해야하므로 클라이언트 측에서 나중에 볼 수 있습니다. –

1

클래스에 "noSuchMethod"메서드를 사용하여 setter/getter를 가로 채고받은 값을지도에 저장할 수도 있습니다.

예를 들어

(나는 ... 정확히 구문을 기억할 수) :

class Foo { 
    var _dynamicProperties = new Map<String,Object>(); 

    noSuchMethod(String function_name, List args) { 
    if (args.length == 0 && function_name.startsWith("get:")) { 
     //synthetic getter 
     var property = function_name.replaceFirst("get:", ""); 
     if (_dynamicProperties.containsKey(property)) { 
     return _dynamicProperties[property]; 
     } 
    } 
    else if (args.length == 1 && function_name.startsWith("set:")) { 
     //synthetic setter 
     var property = function_name.replaceFirst("set:", ""); 
     //if the property doesn't exist, it will only be added 
     _dynamicProperties[property] = args[0]; 
     return _dynamicProperties[property]; 
    } 

    super.noSuchMethod(function_name, args) 
    } 
} 

그리고 다음과 같이 당신은 당신의 코드에서 이것을 사용할 수 있습니다 : 물론

var foo = new Foo(); 
foo.bar = "Hello World"; 
print(foo.bar); 

을,이 유형 검사에 의해 확인되지 않습니다 오타, 예를 들어 이어질 수 :

foo.bar = "Hello"; 
foo.baz = "Hello World"; // typo, meant to update foo.bar. 

있습니다 방법을 사용하면 타입 검사기 버지니아가 리디렉션 팩토리 생성자와 암시 적 인터페이스를 사용하여 뚜껑을 만들었지 만 복잡해지기 시작합니다.

사이드 노트 : 이것은 JsonObject이 json 맵을 클래스 유형 구문으로 변환하는 데 사용됩니다.