所以我没有找到一种自动方法来指示 btouch 挂钩协议方法以在绑定类上NSFastEnumerable提供接口实现。IEnumerable相反,我采用了手动方法,并添加了我自己的带有 IEnumerable 实现的部分类。然后我不得不直接调用这个 Obj-C 库正在包装的 C 库!
public partial class ZBarSymbolSet : IEnumerable<ZBarSymbol>
{
    public IEnumerator<ZBarSymbol> GetEnumerator ()
    {
        IntPtr symbol;
        if ( FilterEnabled )
            symbol = zbar_symbol_set_first_symbol(this.InnerNativeSymbolSetHandle);
        else
            symbol = zbar_symbol_set_first_unfiltered(this.InnerNativeSymbolSetHandle);
        while ( symbol != IntPtr.Zero )
        {
            yield return new ZBarSymbol(symbol,0);
            symbol = zbar_symbol_next(symbol);
        }
    }
    IEnumerator IEnumerable.GetEnumerator ()
    {
        return GetEnumerator();
    }
    [DllImport("__Internal")]
    private extern static IntPtr zbar_symbol_next(IntPtr zBarSymbol); 
    [DllImport("__Internal")]
    private extern static IntPtr zbar_symbol_set_first_symbol(IntPtr zbarSymbolSet); 
    [DllImport("__Internal")]
    private extern static IntPtr zbar_symbol_set_first_unfiltered(IntPtr zbarSymbolSet);
}  
InnerNativeSymbolSetHandle上面用来传递给 C 函数的是我绑定在 ZBarSymbolSet 类上的一个属性,幸运的是,ZBar iPhone SDK 作者从 C ZBar 库中公开了指向底层结构的指针:
// @interface ZBarSymbolSet : NSObject <NSFastEnumeration>
[BaseType (typeof(NSObject))]
interface ZBarSymbolSet
{
    // @property (readonly, nonatomic) int count;
    [Export("count")]
    int Count { get; }
    // @property (readonly, nonatomic) const zbar_symbol_set_t *zbarSymbolSet;
    [Export("zbarSymbolSet")]
    IntPtr InnerNativeSymbolSetHandle{ get; }
    // @property (nonatomic) BOOL filterSymbols;
    [Export("filterSymbols")]
    bool FilterEnabled { get; set; }
}  
所以这是手动解决方案。
我仍然希望 btouch 有一种自动方式来做到这一点(显然不是通过这些 C 函数,而是通过挂钩协议的countByEnumeratingWithState函数NSFastEnumeration。如果 Objective-c 可以使用 Objective-c for 循环以通用方式做到这一点,那么 MonoTouch 肯定也可以自动挂钩吗?