2015-01-04 3 views
1

Привет Я хотел бы написать общий метод check_range(), который получает в качестве параметра raw_type (vin или vout или il и т.д.) и в соответствии с raw_type вызовы соответствующих методов calc_vin() или calc_vout() и т.д. Я пытаюсь использовать отражение get_method() для него:Specman reflection: Как использовать get_method()?

type raw_t : [vin, vout, il, iin]; 
... 
extend my_unit { 

    check_range(raw_type : raw_t) : uint { 
     var meth_name : string = appendf("calc_%s", raw_type); 
     var meth : rf_method = me.get_method(meth_name); //This line causes an error 
     // .... 
    }; 

    calc_vout() is { 
     // Calculates Vout 
    }; 

}; 

Когда я вызываю метод check_range() я получаю ошибку :

Error: 'me' (of type my_unit_u) does not have 'get_method()' method. 

Как я могу подойти к методу calc_vout() с использованием отражения get_method()? Очень ценю вашу помощь

+0

Это похоже на неправильное использование отражения. Вы должны использовать оператор 'case' для вызова соответствующего метода на основе входного аргумента. –

ответ

2

Чтобы работать с устройством отражения, вам нужно использовать «rf_struct» my_unit_u.

В частности, попробуйте следующее:

type raw_t : [vin, vout, il, iin]; 
... 
extend my_unit { 

check_range(raw_type : raw_t) : uint { 
    var meth_name : string = appendf("calc_%s", raw_type); 
    var my_unit_rf := rf_manager.get_struct_of_instance(me); 
    var meth : rf_method = my_unit_rf.get_method(meth_name); 
    // .... 
}; 

calc_vout() is { 
    // Calculates Vout 
}; 

};

+0

Кроме того, чтобы вызвать метод, вы можете использовать 'rf_method.invoke()'. Я тоже редактировал пример Инона, чтобы показать это. –

+0

Я не вижу отредактированную версию ... – Thorsten

Смежные вопросы