在MonoTouch中检查iOS类(而不是方法)的可用性

Tys*_*son 2 xamarin.ios weak-linking ios

MonoTouch公开了RespondsToSelector方法,用于检查iOS版本中方法的可用性.

但是我似乎无法找到如何对类可用性执行类似的检查.
Apple在此处记录,在iOS 4.2+中,您应该尝试访问class所需类的静态选择器.例如:

if ([EKReminder class]) 
{
    ....
}
Run Code Online (Sandbox Code Playgroud)

然而,这似乎没有暴露.我认为它类似于我之前的问题,因为要在MT中实现它,需要Class在每个MT类型上显式映射静态属性.

所以我想我的问题是,我应该使用旧的iOS 4.2前技术吗?即:

Class cls = NSClassFromString (@"EKReminder");
if (cls) 
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

我认为映射到:

var iosClass = Class.GetHandle("EKReminder");
if ( iosClass != null )
    ...
Run Code Online (Sandbox Code Playgroud)

或者使用Messaging中提供的互操作方法手动调用选择器?

还是我找不到的其他方法?

pou*_*pou 5

安全检查是使用:

if (Class.GetHandle (typeof (EKReminder)) != IntPtr.Zero) {
    // we know we can use EKReminder
}
Run Code Online (Sandbox Code Playgroud)

然而,它有点昂贵,因为它涉及反射.Objective-C的名字可以从.NET名称不同(例如NSURLNSUrl,并且只能通过反射找到Register属性).

如果您知道Objective-C名称,那么您可以使用非类型安全的重载来跳过反射.例如

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

再次(并概括我对每个人的回答)使用iOS版本对非硬件功能进行运行时检查通常是最好/更容易/更快的.

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