Проверка доступности классов iOS (а не методов) в MonoTouch


Есть некоторые подробности раскрывает RespondsToSelector метод проверки доступности методов различных версий iOS.

Однако я, кажется, не могу найти, Как выполнить аналогичные проверки доступности класса.
Apple документирует это здесь , что в iOS 4.2+ вы должны попытаться получить доступ к статическому class селектору требуемого класса. например:

if ([EKReminder class]) 
{
    ....
}

Однако это, кажется, не разоблачено. Я думаю, что это похоже на мой предыдущий вопрос здесь , в том, что для реализации этого в MT потребуется явное отображение статического свойства Class на каждый тип MT.

Итак, я предполагаю, что мой вопрос заключается в том, должен ли я просто использовать старую технику до iOS 4.2? то есть:

Class cls = NSClassFromString (@"EKReminder");
if (cls) 
{
    ...
}

Который, я думаю, соответствует:

var iosClass = Class.GetHandle("EKReminder");
if ( iosClass != null )
    ...

Или вызвать селектор вручную, используя методы взаимодействия, доступные в Messaging ?

Или какой-то другой подход, который я не нашел?

2 2

2 ответа:

Проверка safe использует:

if (Class.GetHandle (typeof (EKReminder)) != IntPtr.Zero) {
    // we know we can use EKReminder
}

Однако это немного дорого, потому что это включает в себя размышление. Имя Objective-C может отличаться от имени .NET (например, NSURL против NSUrl, и это может быть найдено только путем отражения атрибута Register).

Если вы знаете имя Objective-C, то вы можете использовать перегрузку, не связанную с типом safe, чтобы пропустить отражение. Например,

// checking for NSUrl would not work
if (Class.GetHandle ("NSURL") != IntPtr.Zero) {
    // we know we can use NSUrl
}

Опять же (и обобщить мой ответ для всех) часто лучше/проще/быстрее использовать версию iOS, чтобы сделать это. время выполнения проверяет наличие не аппаратных функций.

if (UIDevice.CurrentDevice.CheckSystemVersion (5,0)) {
    // we know feature X was added in 5.0
}

Просто используйте технику pre-iOS 4.2:

var iosClass = Class.GetHandle ("EKReminder");
if (iOSClass != null)
    ...

Метод, рекомендованный Apple, кажется, специально разработан gcc / clang, который не будет работать в MonoTouch.