我正在使用Castle DynamicProxy編寫裝飾代理。我需要代理的攔截器攔截唯一的財產寫入(未讀),所以我正是如此檢查方法的名稱:確定MethodInfo實例是否爲屬性訪問器
public void Intercept(IInvocation invocation)
{
if (invocation.Method.Name.StartsWith("set_")
{
// ...
}
invocation.Proceed();
}
現在這工作正常,但我不喜歡我的代理已經成竹在胸的事實如何實現屬性:我想用類似於以下內容替換方法名稱檢查:
if (invocation.Method.IsPropertySetAccessor)
不幸的是,我的Google-fu失敗了我。有任何想法嗎?
看起來很不合適 – thepirat000
@ thepirat000:那麼,如果GetSetMethod是O(1),那麼這將是O(n)。這可能不是最佳的(我肯定會贊同任何其他答案同樣可讀,產生更好的性能),但我相信你知道關於過早優化是所有邪惡根源的說法... – Heinzi
我建議你檢查該方法是否具有「get_」前綴(區分大小寫)並將其從方法集合中移除(仍然是O(n)複雜性 - 這相當便宜)。另外,你可以添加'Dictionary'實例來存放已經檢查過的類型,它首先給你O(n)的複雜度,但是之後O(1) –