(Этот вопрос помечен c#
, потому что я буду делать это с Xamarin, но это скорее вопрос структуры; язык не должен иметь значения.)
Я пытаюсь взаимодействовать с Musi c (ранее iTunes) с использованием Scripting Bridge. Для этого я могу получить SBApplication
и спросить его о свойствах; например, playerState
даст мне информацию о том, воспроизводится ли он в данный момент, а sources
в основном даст мне всю библиотеку в иерархическом порядке.
Но это довольно низкий уровень, поэтому я копался в sdef
и sdp
для генерации некоторого XML и файла заголовка, чтобы написать несколько подходящих классов-оболочек, соответствующих описанным.
Часть, в которой я застрял, - это в основном наследование. Свойство playlists
может содержать различные виды списков воспроизведения (например, MusicPlaylist
, MusicFolderPlaylist
, et c., Все из которых наследуются от MusicPlaylist
), и меня интересуют только экземпляры MusicUserPlaylist
.
Но я запутался, как даже спросить экземпляр его типа на всех , гораздо менее эффективно. Я вижу, что debugDescription
отвечает на это, например:
<SBObject @0x6000008bf180: <class 'cUsP'> id 28712
of <class 'cSrc'> id 63 of application "Music" (8034)>
И из sdef
я вижу, что cUsP
- это то, что я ищу:
<class name="user playlist" code="cUsP"
description="custom playlists created by the user"
inherits="playlist" plural="user playlists">
…
</class>
Но ... я действительно должен разобрать description
для этого? Конечно, есть более хороший способ? Я вижу, что конструктор всегда принимает elementCode
:
- (instancetype) initWithElementCode:(DescType)code
properties:(nullable NSDictionary<NSString *, id> *)properties data:(nullable id)data;
(на самом деле я не на 100% уверен, что DescType
- это то же самое, что, например, class 'cUsP'
?)
И, тем не менее, не существует способа получить код этого элемента back ?
TL; DR: учитывая SBElementArray
, который может содержать различные подклассы, как Я подтверждаю, что тип динамического c сценария моста экземпляра является определенным классом?