获取[PrologueSnippet]来处理属性

时间:2013-02-01 21:27:33

标签: xamarin.ios

我将库绑定到monotouch。由于NullReferenceException在monotouch上发生了非常糟糕的事情,我想通过在访问将要抛出的属性时抛出System.InvalidOperationException来阻止它。

对于方法,我正在使用[PrologueSnippetAttribute]。但由于显而易见的原因,它不适用于属性。我怎么能对属性有相同的行为?

2 个答案:

答案 0 :(得分:1)

SnippetAttribute继承的PrologueSnippetAttribute定义与btouchgenerator.cs)源代码不匹配。

生成器只处理方法的属性,而不处理属性(即使属性标有AttributeTargets.Property)。所以你需要做一些事情:

[Export ("position")]
PointF Position {
    [PrologueSnippet ("if (!isInitialized) throw new InvalidOperationException ();")]
    get;
    [PrologueSnippet ("if (!isInitialized) throw new InvalidOperationException ();")]
    set;
}

这比复制属性(使用[Internal]版本)更好。我相信的原因是,大多数时候,相同的逻辑不能用于getter和setter。

答案 1 :(得分:0)

当然,我可以标记属性[Internal]并为它编写公共代理作为额外代码,如下所示:

在ApiDefinition.cs

...
[Export ("position")]
[Internal]
PointF PositionInt { get; set; }
...

然后在Extra.cs

...
public PointF Position {
    get {
        if (!isInitialized)
            throw new InvalidOperationException ();
        return PositionInt;
    }
    set {
        if (!isInitialized)
            throw new InvalidOperationException ();
        PositionInt = value
    }
}
...

但更快更自动化的东西会很好