2016-08-25 9 views
1

のすべてのパラメータをメソッド内でコード化することなく変更できますか?
私はデータベース層としてstoredproceduresを使用しています。このタスクでは、'*'ワイルドカードを提供するワイルドカードを使用します。を '%' sqlワイルドカードに変更する必要があります。

このようWildcardAttributeを持つことは素晴らしいことだ:メソッドパラメータを多くの方法で同じ方法で変更します

[WildcardAttribute('*', '%')] 
[WildcardAttribute('?', '_')] 
SearchMethod(s) // -> value of s: * 
{ 
    InvokeSPROC(s) // -> value of s: % 
} 

の代わり:

SearchMethod(s) // -> value of s: * 
    { 
     InvokeSPROC(s.Replace("*", "%").Replace("?", "_")) 
    } 

のメーリングのSPROCで、この変更はオプションではありません..です

ありがとうございました!

答えて

2

確かに、PostSharpのようなAOPフレームワークを使用してそれを行うことができます。 https://www.postsharp.net/aop.net

たとえば、http://doc.postsharp.net/method-decoratorを参照してください。セクションパラメータへのアクセス

また、アスペクトメソッド内のパラメータ値を変更することもできます。引数コレクション内の項目の値を変更するだけです。 Argumentsコレクションのすべての項目はオブジェクト型であるため、値の変更方法に注意する必要があります。変更する値が元々文字列だった場合は、文字列型のままにしておくことをお勧めします。

.Net用のAOPフレームワークがありますので、それらについて読むことができます。

ところで、あなたのコードInvokeSPROCはどうやって見えますか?そこの文字を置き換えることはできませんか?

EDIT: あまりにもあなたはそれのためのメソッドを作成したり、多分このような拡張メソッドを書くことができますいずれかの複雑されている場合:

public static class StringExtensions 
{ 
    public static string SanitizeForStoredProcedure(this string pattern) 
    { 
     return pattern.Replace("*", "%").Replace("?", "_");  
    } 
} 

あなたはその後、

SearchMethod(s) // -> value of s: * 
{ 
    InvokeSPROC(s.SanitizeForStoredProcedure()) // -> value of s: % 
}  
+0

AOPを使用して、それを呼び出すことができますものは私の要件のために複雑に思われるので、私はSPROCの侵略の方法を強化します。 –

+1

@DanielDevo少し時間がかかります。しかし、それは強力です。しかし、私は、拡張メソッドを使って別の方法で自分の答えを更新しました。また、意図したとおりに動作を変更するためにコードを修正する必要があることを確認している限り、同じ方法で簡単なメソッドを作成することもできます。拡張メソッドの詳細:https://msdn.microsoft.com/en-us/library/bb383977.aspx –

関連する問題