2012-10-22 4 views
2

개체를 가져 와서 반복하는 메서드가있는 클래스를 가져 와서 개체 값을 클래스에 할당합니다. 이것은 응용 프로그램에서 상당히 발생할 수 있으며, 객체의 속성 이름을 확인하고 클래스에 할당하기 전에 값 유형을 확인하는 언어가 아닌 효율적이고 바람직하지 않은 구문이 있는지 궁금합니다. 적어도이 코드를 플래시 및 자바 스크립트로 내보낼 필요가 있습니다. 나중에 다른 코드를 따라 할 수도 있습니다. 메소드가 기본 클래스에 있기 때문에이 메소드를 generic으로 유지해야합니다. 아래 라인을 따라 뭔가 :속성 및 유형에 대한 클래스 확인

public function updateProperties(propsObj:Object):void { 
    for (var prop in propsObj) { 
    if (/* this has prop && typeof propsObj[prop] == typeof this[prop] */) { 
     this[prop] = propsObj[prop]; 
    } 
    } 
} 

Haxe의 새로운 기능, 그래서 이런 종류의 방법에 대한 일련의 방법을 찾는 데 어려움을 겪고 있습니다. 리플렉션은 내가 찾고있는 것과 가까운 방법을 가지고있는 것처럼 보이지만, 필요한 정보가 너무 많아서 많은 통찰력을 얻기를 바라는 것처럼 보이는 방법이 많이 있습니다.

답변

5

이것은 작동하는 것 같습니다.

public function updateProperties(props:Dynamic) { 
    for (prop in Reflect.fields(props)) { 
    if (Reflect.hasField(this, prop)) { 
     Reflect.setProperty(this, prop, Reflect.getProperty(props, prop)); 
    } else { 
     trace("cannot set property " + prop + " on " + this); 
    } 
    } 
} 
+0

그것은 당신이 그것을 알아 냈처럼 ... Reflect.setProperty은() Refelct.setField()와 비슷하지만, 당신이 haxe 속성을 상대하고있는 경우에는 추가 점검을 조금 않습니다 보인다 (예를 들어' var myProp (get_myProp, set_myProp) : String'). 속성이 아니라 단순 변수 만 가질 것이라는 것을 알고 있다면 Reflect.setField()가 약간 더 빠를 수도 있습니다. –

+0

'Type.typeof'로 타입을 얻고 그 결과를'Type.enumEq'와 비교할 수 있습니다 (결과 값이 enum이기 때문에). – back2dos

+0

확인해 주셔서 감사합니다. 이 경우 거의 모든 구성 요소에 공통 될 것이므로 어떤 유형의 특성이 설정 될지 알 수 없습니다. 덜 보편적 인 기능을 위해서 setProperty에 대해 알아두면 좋을 것입니다. – Shane

관련 문제