2016-03-25 16 views
2

this question - Bulunduğum işe çok benzer. Ancak kullanım durumum biraz farklı.C# özelliği bir yönteme parametre ekleyebilir mi?

İşletme hizmetleri için denetim geçmişini kaydetme ihtiyacımız var. Bununla birlikte, sadece ve daha sonra değil, yöntem çağırma sırasında denetim kontrol noktalarını manuel olarak aramamız gerekiyor.

Projemizde Castle.Core'u kullanıyoruz. Bunu başarmak için, hizmet yöntemlerimizde kullanmak üzere (iş mantığını denetlemek için) AuditContext adında bir özel nitelik oluşturmayı planlıyorum. Meta veriye dayalı yeni bir bağlam nesnesi oluşturacak bir günlüğe kaydetme proxy'si oluşturmak için Castle DynamicProxy kullanmayı planlıyorum öznitelik nesnesindeki argümanlar. Ne yapmak istediğim, bu nesneyi yöntem argümanı olarak benim yöntemime enjekte etmektir, ancak oluşturduğumuz her hizmet yönteminde bir AuditContext parametresi belirtmek zorunda kalmadan. Bu yerine Esasen

:

[AuditContext(someStaticMetadata) 
public BusinessObject BusinessMethod (AuditContext context, ...arguments) { 
    // ...some logic... 
    context.checkpoint(someAuditData); 
} 

Bunu yapabilmek istiyorum:

[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. 
} 

Ya da, çok daha genel bir örnek yapmaya, bu yazmak istiyorum:

[ProvidesParam2] 
public Object myFunc (param1) { } 

... ve bu imzaya sahip bir fonksiyonu ile bitirmek:

public Object myFunc (param1, param2) { } 

Damıtılmış soru şudur: C# özniteliği, süslediği bir yönteme bir parametre ekleyebilir, tasarım zamanında yöntemin imzasını etkili biçimde değiştirebilir mi?

Teşekkürler!

+0

Bağladığınız soruyu yanıtladığınız bağlantı arasındaki tek fark, "AuditContext" in bazı statik meta verileri almasıdır, oysa bağlantılı sorudaki yanıt bir arabirim alır. Her iki durumda da bir nesneyi başlatmak için yansıma kullanmanız gerekir. Bana neyi sorduğunuzu, bağlantılı sorudan nasıl farklı olduğunu açıklayamazsanız, bir kopya olarak kapatmak için oy kullanmaya eğilimliyim. –

+0

@JimMischel Yaptıkları ile ne yaptığım arasındaki temel fark, bir yöntemin yöntem imzasını değiştirmek için bir öznitelik kullanmaya çalışıyorum. Aslında, bu soruyu sadece bir kopya olmadığını göstermek için verdim. Benim kullanım durumum onunla ilgili ama temel sorun farklı. Sağladığım kod örneklerine bakın. –

+0

Bir parametre olarak geçmeden 'someAuditData' alacağın tek yolu, 'AuditContext' özniteliğini bulmak için yansıma kullanmak ve sonra' Activator.CreateInstance 'nesnesini oluşturmak, yalnızca bağlantılı soruyu yanıtlamak gibi diyor. Ona bir parametre gibi erişemezsin. –

cevap

2

Kısa cevap: hayır. Nitelikler, özel durumlarda (çağrı kuralı gibi) imza olarak yorumlayabildiğiniz şeyleri değiştirir, ancak kesinlikle argüman listesini değiştiremezler. İstediğinizi özel bir IL rewriter ile elde edebilirsiniz; PostSharp gibi bir şey yardımcı olabilir (feragatname: PostSharp kullanarak hiç deneyimim yok).

İlgili konular