我發現this question - 這與我所嘗試的非常相似。但是,我的用例有點不同。C#屬性可以爲方法添加參數嗎?
我們需要存儲商業服務的審計歷史記錄。但是,我們需要能夠在方法調用期間手動調用審計檢查點,而不僅僅是在調用之前和之後。
我們在我們的項目中使用Castle.Core。爲了達到這個目的,我打算創建一個名爲AuditContext
的自定義屬性,用於我們的服務方法(用於審計業務邏輯等)。我打算使用Castle DynamicProxy創建一個日誌代理,該代理將根據元數據創建一個新的上下文對象屬性對象中的參數。我想做的是將此對象注入我的方法作爲方法參數,但不必在我們創建的每個服務方法上指定AuditContext
參數。
本質,而不是這樣的:
[AuditContext(someStaticMetadata)
public BusinessObject BusinessMethod (AuditContext context, ...arguments) {
// ...some logic...
context.checkpoint(someAuditData);
}
我希望能夠做到這一點:
[AuditContext(someStaticMetadata)
public BusinessObject BusinessMethod (...arguments) { // We do not have to specify the context object for every business method...
// ...some logic...
context.checkpoint(someAuditData); // ...but the object is still available, as the parameter has been added by the argument.
}
或者,做一個更通用的例子,我想這樣寫:
[ProvidesParam2]
public Object myFunc (param1) { }
...並結束與此簽名的功能:
public Object myFunc (param1, param2) { }
蒸餾的問題是這樣的 - C#屬性可以爲它所修飾的方法添加一個參數,在設計時有效地改變方法的簽名?
謝謝!
我在你問的問題和你鏈接的問題的答案之間唯一的區別是,AuditContext需要一些靜態元數據,而鏈接問題中的答案需要一個接口。無論哪種方式,你必須使用反射來實例化一個對象。除非你能向我解釋你所要求的與所鏈接的問題不同,否則我傾向於投票結束重複。 –
@JimMischel他在做什麼和我在做什麼之間的主要區別是我試圖使用屬性來更改方法的方法簽名。事實上,我只是提出這個問題來表明它不是重複的。我的用例與他有關,但基本問題不同。查看我提供的代碼示例。 –
只有在不傳遞參數的情況下才能獲得'someAuditData'的唯一方法是使用反射來定位AuditContext屬性,然後使用Activator.CreateInstance來實例化它,就像鏈接問題的答案一樣說。您不能像訪問參數那樣訪問它。 –