1

我将库绑定到单点触控。就像NullReferenceException在单触上发生的一件非常糟糕的事情一样,我想通过抛出一段System.InvalidOperationException时间访问一个会抛出的属性来防止它。

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

4

2 回答 2

1

继承SnippetAttribute自的 定义与( generator.cs ) 源代码不匹配。PrologueSnippetAttributebtouch

生成器只处理方法上的属性,而不是属性(即使属性标有AttributeTargets.Property)。因此,您需要执行以下操作:

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

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

于 2013-03-05T18:51:56.420 回答
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
    }
}
...

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

于 2013-02-01T21:34:18.783 回答