我将库绑定到monotouch。由于NullReferenceException
在monotouch上发生了非常糟糕的事情,我想通过在访问将要抛出的属性时抛出System.InvalidOperationException
来阻止它。
对于方法,我正在使用[PrologueSnippetAttribute]
。但由于显而易见的原因,它不适用于属性。我怎么能对属性有相同的行为?
答案 0 :(得分:1)
SnippetAttribute
继承的PrologueSnippetAttribute
定义与btouch
(generator.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
}
}
...
但更快更自动化的东西会很好